2017-05-01 48 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