0

我必须编写一个脚本来模拟后台不同程序中的一些键盘事件。这是我的代码:</p>

pwin = win32ui.FindWindow(None,r'someprograme')
pwin.SendMessage(win32con.WM_KEYDOWN,18)
pwin.SendMessage(win32con.WM_KEYDOWN,68)
pwin.SendMessage(win32con.WM_KEYUP,18)
pwin.SendMessage(win32con.WM_KEYUP,68)
pwin.SendMessage(win32con.WM_KEYDOWN,13)
pwin.SendMessage(win32con.WM_KEYUP,13)

但似乎什么也没发生。那我该怎么办?我试过 PostMessage func 似乎仍然无法做到。

4

1 回答 1

1

快速查看WM_KEYDOWN 文档后:

当按下非系统键时,以键盘焦点发布到窗口。非系统键是在未按下 ALT 键时按下的键。

但是查找您的 keycodes,您正在尝试发送 ALT-D (后跟 ENTER,这很好)。听起来您正在尝试驱动菜单;如果那是您想要做的,那WM_KEYDOWN不是这样做的方法。

问题是键盘菜单导航是由 Windows 驱动的,而不是由应用程序驱动的(除了少数覆盖正常菜单处理的应用程序,如某些版本的 Visual Studio)。当您查看记事本并按 ALT-F 打开“文件”菜单时,记事本代码会收到一堆与菜单相关的消息(WM_INITMENU等),而不是击键。

如果您使用 WM spy 程序(我认为免费的 Visual Studio Express 仍然带有 Spy++ 和 ManagedSpy,但如果没有,请搜索等效程序),您可以看到应用程序在使用键盘驱动时实际看到的内容,并且然后你可以弄清楚如何从你的 Python 脚本中模拟它。

最重要的是,根据程序的编写方式,当它没有焦点时,它可能不接受击键。

顺便说一句,如果您刚刚开始使用 Windows GUI 自动化,您可能希望查看更高级别的内容,例如pywinauto. 这样,您不必弄清楚要发送哪些与菜单相关的消息来打开“数据”菜单;你只是做类似的事情app.Foo.MenuSelect('Data')

于 2013-01-28T09:37:48.160 回答