如何将键盘事件发送到Pywin32中的其他窗口?

时间:2013-01-28 08:31:35

标签: python pywin32

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

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它似乎仍然无法做到。

1 个答案:

答案 0 :(得分:1)

快速查看WM_KEYDOWN docs

  

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

但是查找your keycodes,你正在尝试发送ALT-D(接着是ENTER,这很好)。这听起来像是在试图推动菜单;如果那就是你想做的事,WM_KEYDOWN就不是这样做的了。

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

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

除了其他一切之外,根据程序的编写方式,当它没有焦点时,它可能不接受击键。

顺便说一句,如果您刚刚开始使用Windows GUI自动化,您可能需要查看更高级别的内容,例如pywinauto。这样,您不必计算要发送的菜单相关消息以打开数据菜单;你只需做app.Foo.MenuSelect('Data')之类的事情。