2017-05-01 130 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鍵,則停止。

另一件事是,這段代碼是爲了關閉shell。它只適用於右菜單鍵碼而不是ALT鍵碼和左菜單鍵碼。 (我知道有其他的方法來關閉shell,但這一關的東西)

這裏是我想知道:

  1. 爲什麼這按住ALT 關鍵
  2. 如何在代碼中阻止此操作?
  3. 爲什麼這不適用於alt鍵碼或左鍵菜單鍵碼?

在此先感謝任何有幫助的人。

+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

我不知道你是否還在尋找答案,但我認爲問題在於你沒有模擬鍵盤命令。添加下面三行代碼應該能夠模擬你在找什麼。對於下面的代碼,我假設你需要按順序(即按下右側菜單鍵,按下F4鍵,然後按回車鍵)。但是,如果您想按住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