动机。 我使用的软件没有API接口... ... 我别无选择,只能打开软件,发送简单的密钥序列,然后关闭......。一次又一次,所以我想把这个过程自动化。
目标:将键盘输入的组合发送到一个API接口。 将键盘输入的组合发送到一个不活动的窗口。
进展情况:我写了一个powershell脚本,可以打开软件,并发送简单的按键序列,然后关闭......一次又一次,所以我想把这个过程自动化。 我写了一个powershell脚本,打开,发送按键,等待,然后结束这个过程,但它只适用于活动窗口。其中一部分powershell代码如下。
$appProcess = Start-Process -FilePath $path -PassThru
$wshell = New-Object -ComObject wscript.shell;
$wshell.AppActivate($appProcess.Id)
$wshell.SendKeys('%(E)E')
Stop-Process $appProcess -Force
它可以工作,但只在活动窗口上工作(窗口到顶)。我想要的是在后台运行自动窗口。我发现 文章 指引我使用 留言 在Win32 API中。由于我的大部分代码都使用python,所以我决定从powershell转移到pywin32。
问题。 我无法获得 留言 来发送密钥到正确的处理程序。我在 本文 我可能需要找到准确的窗口,但我还是不明白怎么做。在 powershell 中,我可以直接通过 $wshell.AppActivate($appProcess.Id).
hwndMain = win32gui.FindWindow(None, winname)
hwndChild = win32gui.GetWindow(hwndMain, win32con.GW_CHILD)
temp = win32api.PostMessage(hwndChild, win32con.WM_KEYDOWN, 0x45, 0)
# temp came out as None
疑问:在pywin32 Win32 API中有没有办法做到这一点? 在pywin32 Win32 API中是否有办法做到这一点?
编辑:(2020年5月8日)是的,听说用SendKeys不靠谱,但既然SO上没有提供类似这个问题的替代方案,大家应该如何学习 "正确的方法 "呢?如果你认为有替代方法,大家会很感激看到实际的解决方案。请对我的帖子提出编辑建议,以提高问题的质量,而不是将其击倒。
前段时间我开发了 SendMessage 工具 允许通过WIN32 API向其他进程或窗口发布消息。我发现我不能向一个不活动的窗口发送消息,所以我寻找一种方法来激活一个窗口。经过几次测试,我找到了一个可以让我 "重新激活 "一个窗口的技巧。
在开发这个程序的过程中,出现了一个问题:如果窗口没有被激活,记事本最上面的菜单中的项目就无法选择。 我做了一些测试,发现这一点取决于cmd.exe窗口与其他窗口和其他窗口中的特定程序的关系。例如,在计算器窗口附件的情况下,它的菜单项可以在窗口未激活时选择,甚至在窗口最小化时也可以选择!我试图开发一种方法来激活这个窗口。我试着开发一种方法,只用系统定义的消息就能从cmd.exe窗口激活其他窗口。我使用WM_ACTIVATE、WM_CANCELMODE、WM_ENABLE、WM_ACTIVATEAPP、WM_SETFOCUS和WM_KILLFOCUS消息的不同组合做了几次测试,但没有成功。幸运的是,任何窗口的系统菜单中的项目都可以从另一个窗口中选择,而且在SC_RESTORE之后,恢复后的窗口仍然是活动的;这种行为使得通过MinimizeRestore过程从cmd.exe之一激活记事本和其他窗口成为可能。
我认为,使用我的SendMessage.exe实用程序,你可以测试是否可以向你的非活动窗口进程发送键或激活它,所以你可以然后将这样的方法翻译到你的phyton代码中。关于这个问题的完整细节,请看 这个环节.