2017-05-01 26 views
1

次のように私はいくつかのpython(2.7.13)のコードを持っている:のPythonのctypesキーボードイベント

import win32api, win32con, ctypes 

ctypes.windll.user32.keybd_event(0xA5, 0, 0, 0) # Right Menu Key 
ctypes.windll.user32.keybd_event(0x73, 0, 0, 0) # F4 

ctypes.windll.user32.keybd_event(0x0D, 0, 0, 0) #Enter Key 

私は、私は、Pythonを閉じた後も、コードの私のコンピュータのバグを実行するたびに。 altキーが常に押されているようです。 altキーを手動で押すと、これは停止します。

もう1つのことは、このコードはシェルを閉じることです。右のメニューキーコードでのみ動作し、altキーコードや左のメニューキーコードでは動作しません。 (私はシェルを閉じるには、他の方法がある知っているが、これは何かを閉じます。)ここで

は私が知りたいです:

  1. なぜこれがALTキーを押したままにしていますか?
  2. これを私のコードでどうやって止めるのですか?
  3. altキーコードまたはleft-menuキーコードでこれが機能しないのはなぜですか?

ありがとうございました。

+1

入力を偽装することによってアプリケーションを自動化することは悪い考えです。代わりに、オートメーションインターフェイス([UI Automation](https://msdn.microsoft.com/en-us/library/windows/desktop/ee684009.aspx))を使用する必要があります。あなたの実際の質問について:あなたはキーアップイベントを注入しないので、システムは[Alt]キーが押されたと仮定します。それが期待される。 – IInspectable

+0

@IInspectableあなたの助けていただきありがとうございますが、あなたが言ったようにキーアップイベントを追加するにはどうすればいいですか? – Sank6

+1

'KEYEVENTF_KEYUP'フラグを[keybd_event](https://msdn.microsoft.com/en-us/library/windows/desktop/ms646304.aspx)に渡します。 – IInspectable

答えて

0

pywinautoを使用してユーザー入力をエミュレートできます。あなたの問題はすでにその内部で解決されています。サブモジュールpywinauto.keyboardので使用することができます。

from pywinauto.keyboard import SendKeys 
SendKeys('%{F4}{PAUSE 0.2}{ENTER}') # press Alt+F4, pause, press Enter 

ちょうど前に、コマンドラインでpip install pywinautoを実行します。

1

答えを探しているかどうかわかりませんが、キーアップコマンドをシミュレートしていないという問題があると思います。下の3行のコードを追加すると、探しているものをシミュレートできるはずです。

以下のコードでは、右のメニューキーを押し、F4キーを押してからEnterキーを押します。ただし、Shift + 'a'の場合と同様に、両方のキーダウンイベントを呼び出すと、両方のキーアップイベントを呼び出すことになります。

import win32api, win32con, ctypes 
ctypes.windll.user32.keybd_event(0xA5, 0, 0, 0) # Right Menu Key Down 
ctypes.windll.user32.keybd_event(0xA5, 0, 0x0002, 0) # Right Menu Key Up 
ctypes.windll.user32.keybd_event(0x73, 0, 0, 0) # F4 Down 
ctypes.windll.user32.keybd_event(0x73, 0, 0x0002, 0) # F4 Up 
ctypes.windll.user32.keybd_event(0x0D, 0, 0, 0) #Enter Key Down 
ctypes.windll.user32.keybd_event(0x0D, 0, 0x0002, 0) #Enter Key Up 
+0

ありがとうございました。私はそれを理解しました...しかし、将来の訪問者のために、それは良いです! – Sank6