如何自动化UI键盘输入?pywin32 PostMessage与Powershell SendKeys



动机:我使用的软件没有API接口。。。我别无选择,只能打开软件,发送简单的密钥序列,然后关闭。。。一次又一次,所以我想自动化这个过程。

目标:将键盘输入组合发送到非活动窗口。

进度:我写了一个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中使用PostMessage。由于我的大部分代码都使用python,所以我决定从powershell迁移到pywin32。

问题:我无法获得PostMessage将密钥发送到正确的处理程序。我在这篇文章中看到,我可能需要找到确切的窗口,但我仍然不知道如何找到。在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中有办法做到这一点吗?


编辑:(2020年5月8日(是的,我听说使用SendKeys不可靠,但由于SO上没有类似问题的替代方案,任何人都应该如何学习"正确的方法"?如果你认为还有其他选择,每个人都会很高兴看到解决方案的实施。请建议对我的帖子进行编辑,以提高问题的质量,而不是将其删除。

不久前,我开发了SendMessage实用程序,该实用程序允许通过WIN32 API将消息发布到其他进程或Windows。我发现我无法向非活动窗口发送消息,所以我搜索了一种激活窗口的方法。经过几次测试,我发现了一个可以"重新激活"窗口的技巧:

这个程序的开发出现了一个问题:如果窗口未处于活动状态,则无法选择记事本最上面的菜单。我做了一些测试,发现这一点取决于cmd.exe窗口与其他窗口的关系(具有?(,以及另一个窗口中的特定程序。例如,在计算器Windows配件的菜单项可以在窗口未处于活动状态,甚至在窗口最小化时也是如此!我尝试开发一种方法来从cmd.exe激活其他窗口其中一个仅使用系统定义消息。我用WM_ACTIVATE、WM_CANCELMODE、WM_ENABLE的各种组合,WM_ACTIVATEAPP、WM_SETFOCUS和WM_KILLFOCUS消息,无成功幸运的是,任何窗口的系统菜单中的项目都可以从另一个窗口中选择,并且在SC_RESTORE之后恢复窗口保持活动状态;此行为使激活成为可能记事本和cmd.exe中的其他窗口,通过最小化/还原程序

我认为,使用我的SendMessage.exe实用程序,您可以测试是否可以向非活动窗口进程发送密钥或激活它,这样您就可以将这样的方法转换为您的phyton代码。有关此问题的完整详细信息,请参阅此链接。

最新更新