pythonキーボード自動入力を実現

7409 ワード

Windowsには、アナログキーボードAPI関数Keybd_が用意されています.event()は、キーボードの動作を遮断するために使用されます.Keybd_event()関数は、WM_KEYDOWNまたはWM_KEYUPメッセージを生成するキーイベントをトリガーします.
この関数のプロトタイプは次のとおりです.
VOID keybd_event(
BYTE bVk,//virtual-key code
BYTE bScan,//hardware scan code
DWORD dwFlags,//flags specifying various function options
DWORD dwExtraInfo//additional data associated with keystroke
);
プロトタイプからわかるように、Keybd_event()には4つのパラメータがあります.
             ,     vk_return, tab  vk_tab(         :           );

           ,      , 0    ;

            ,   keydown  0  ,   keyup   "KEYEVENTF_KEYUP";

            0  。

例1:アナログ押下’A’キーkeybd_event(65,0,0,0);    keybd_event(65,0,KEYEVENTF_KEYUP,0);
例2:アナログ押下’ALT+F 4’キーkeybd_event(18,0,0,0);    keybd_event(115,0,0,0);    keybd_event(115,0,KEYEVENTF_KEYUP,0);    keybd_event(18,0,KEYEVENTF_KEYUP,0);
附:常用アナログキーのキー値対照表(参考も可)http://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx)
                                                                

アルファベットとテンキーテンキーキーボードのキー機能キーその他のキーキーキーキーキーキーキーキーキーキーキーキーキーコードA 65 0 96 F 112 Backspace 8 B 66 1 97 F 2113  Tab       9       C   67    2   98     F3   114   Clear      12       D   68   3   99     F4   115  Enter      13       E   69    4   100    F5   116  Shift      16       F   70    5   101    F6   117  Control     17       G   71    6   102    F7   118   Alt       18       H   72    7   103    F8   119  Caps Lock    20       I   73    8   104    F9   120  Esc       27       J   74    9   105    F10  121  Spacebar    32       K   75    *   106    F11  122  Page Up     33       L   76    +   107    F12  123  Page Down    34       M   77    Enter 108    –   –   End       35       N   78    -   109    –   –    Home      36       O   79    .   110    –   –     Left Arrow   37       P   80    /  111    –   –     Up Arrow    38       Q   81    –   –     –   –     Right Arrow   39       R   82    –   –    –   –      Down Arrow    40       S   83    –   –     –   –     Insert      45       T   84    –   –     –   –     Delete      46       U   85    –   –     –   –     Help       47       V   86    –   –    –   –     Num Lock     144       W   87                 X   88             Y   89             Z   90             0   48             1   49             2   50              3   51              4   52              5   53              6   54              7   55              8   56              9   57
アナログキーボードは普段あまり使われていませんが、ショートカットキーを呼び出して機能を実行すると、本当に便利ですね.信じないの?次の実現を見て、あなたは大声で叫びます:どうして早く私に教えてくれませんか?ほほほ、もとはblogがなくて、すべてこれらに頼って点数を稼ぎます.
  • デスクトップの表示:
                  ,              ,          ,    win             WIN (      CTRL  ALT       win     ),    ,               .
    
    keybd_event(VK_LWIN, 0, 0 ,0); keybd_event(‘M’, 0, 0 ,0); keybd_event(‘M’, 0, KEYEVENTF_KEYUP ,0); keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);

  • 他の操作も同様で、例えば開始した運転を直接表示し、上の「M」を「R」に置き換えればよい.
    直接keybd_event(VK_LWIN, 0, 0 ,0); keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);
    [開始](Start)ダイアログボックスが直接表示されます.
  • 迅速な全選を実現
          ,  listctrl    ,    listctrl             ,       。       CTRL+A,           ,  ,        ?
    
    keybd_event(VK_CONTROL, (BYTE)0, 0 ,0); keybd_event(‘A’,(BYTE)0, 0 ,0);//ここでは「A」、(BYTE)65、「a」では機能しない.keybd_event(‘A’, (BYTE)0, KEYEVENTF_KEYUP,0); keybd_event(VK_CONTROL, (BYTE)0, KEYEVENTF_KEYUP,0);
  • は、デジタルキー、大文字小文字などの特殊なキーを実行します.以下は、デジタルキーの例bool bState=trueです.//trueはNumLock、false逆BYTE keyState[256]を押す.GetKeyboardState((LPBYTE)&keyState); if( (bState && !(keyState[VK_NUMLOCK] & 1)) || (!bState && (keyState[VK_NUMLOCK] & 1)) ) {//Simulate a key press keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );
     // Simulate a key release
     keybd_event( VK_NUMLOCK,
         0x45,
         KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
         0);
    
    }

  • 4)CTRL+ALT+DELETEの3つのキーを一緒に押したい場合、
    keybd_event(VK_CONTROL, 0, 0 ,0);
    keybd_event(VK_MENU,0, 0 ,0);
    keybd_event(VK_DELETE,0, 0 ,0);
    
    keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP ,0);
    keybd_event(VK_MENU,0, KEYEVENTF_KEYUP ,0);
    keybd_event(VK_DELETE,0, KEYEVENTF_KEYUP ,0);
    

    ほほほ、これは成功しません.このいくつかのキーは直接オペレーティングシステムで実行されているので、アナログキーボードはアプリケーションにしか送信できません.だから、この方法はできません(ロックダイアログを表示したいので、LockWorkStation()
    5)Window 2000/NT/XPはもうこの関数を使うことを提唱していません.上の方法はみんなに考えを広げるために、どのように取って代わるのか、ほほほ、下を見て、だから上のすべてのコードはこれで完成することができます.
    //2000でこれに代えて「winable.h」INPUT input[4];memset(input, 0, sizeof(input));
    input[0].type = input[1].type = input[2].type = input[3].type = INPUT_KEYBOARD;
    
    input[0].ki.wVk  = input[3].ki.wVk = VK_LWIN;
    input[1].ki.wVk  = input[2].ki.wVk = 'R';
    
    
    //      ,      。
    input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP;
    input[0].ki.time = input[1].ki.time = input[2].ki.time = input[3].ki.time = GetTickCount();
    
    SendInput(4, input, sizeof(INPUT));
    

    それよりちょっと羅索的な感じがしますが、ほほほ.
    ====================
    WINキーの一部のショートカットキー:
    WINキー+D=デスクトップに素早く切り込み、再度クリックして戻る
    WINキー+E=Express Open Resource Manager
    WINキー+R=「運転」です.
    WINキー+M=全ウィンドウ最小化.
    WINキー+Shift+M=全ウィンドウ最小化を解除します.
    WINキー+F 1=Help.
    WINキー+F=「探す」.
    WINキー+Ctrl+F=「パソコン検索」が表示されます.
    WINキー+Tab=ワークカラムを切り替えるプログラムです.
    WINキー+Break=システム内容を表示します.
                            SendMessage keybd_event  PostMessage
    

    まずkeybd_を見つけますevent関数にはウィンドウハンドルがパラメータとしてないので、好奇心のあるあなたはきっとおかしいと思います.それはkeybd_eventはグローバルシミュレーションキーであり、フロントウィンドウ(現在のアクティブウィンドウ)のみでよいが、シミュレーションキーがちょうどウィンドウのグローバルホットキーメッセージである場合、そのウィンドウも受信できる
    一方、SendMessage、PostMessageは、指定したハンドルウィンドウに作用し、いくつかのフックを作るのに役立ちます.例えば、あるウィンドウで動作をシミュレートしながら、自分が他のウィンドウで他のことをすることができ、互いに影響しないという効果が得られます.
    しかし、キーボードメッセージをシミュレートするとき、WM_をシミュレートするのを忘れる人が多いことに注意してください.KEYUPのメッセージ..
    もう一つ、PostMessageのウィンドウハンドルパラメータは、HWND_に設定できます.BROADCAST、すなわちブロードキャストですが、当然ながらすべてのウィンドウに役立つとは思わないでください!!!システムの最上位ウィンドウにのみ機能し、サブウィンドウはこのメッセージを受信できません!!!
    注意しなければならないのは、SendMessageにはHWNDがありません.BROADCASTパラメータの、それは、SendMessageがいつも送信したメッセージが対応するウィンドウメッセージキューで処理されてから戻ってくるので(これは責任ある行為です)、よく考えてみるとなぜSendMessageにHWND_BROADCASTパラメータがないのかがわかります!!
    個人的には
    1.アナログキーボード入力コマンドが必要な場合、例えばCtrl+V、keybd_を選択event;
    2.アナログキーボードに文字列を入力する必要がある場合、PostKeybdMessageを選択します.
    3.アナログキーボードで1文字入力が必要な場合はkeybd_を選択event.
    SendMessage(Button.Handle,WM_LBUTTONDOWN,0,0);マウスの左ボタンでSendMessage(Button.Handle,WM_LBUUTTONUP,0,0)を押します.マウスの左ボタンでSendMessage(Edit.Handle,WM_SETTEXT,255,Integer);伝達テキストSendMessage(Edit.Handle,WM_Char,Wparam(‘Q’),2);伝達文字SendMessage(Button.Handle,BM_SETSTYLE,BS_RADIOBUTTON,1);ButtonスタイルSendMessage(ComboBox.Handle,CB_SETDROPPEDWIDTH,300,0)を変更します.CBDownWidth WMを変更CUT、WM_COPYとWM_PASTEカット、コピー、貼り付け
    任意の結合キーkeybd_を実現event(VK_Control, MapVirtualKey(VK_Control, 0), 0, 0); keybd_event(ord(‘V’), MapVirtualKey(ord(‘V’), 0), 0, 0); keybd_event(ord(‘V’), MapVirtualKey(ord(‘V’), 0), KEYEVENTF_KEYUP, 0); keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), KEYEVENTF_KEYUP, 0);
    シミュレーションマウス押下イベント::PostMessage(hwd 0,WM_MOUSEMOVE,MK_LUTTON,MAKELONG(x,y);:PostMessage(hwd0,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(x,y));::PostMessage(hwd0,WM_LBUTTONUP,MK_LBUTTON,MAKELPARAM(x,y));
    シミュレーションキーボード押下イベントkeybd_event(VK_TAB,0,0,0); keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0);
    変換元:https://blog.csdn.net/zhanglidn013/article/details/35988381