【发布时间】:2020-08-21 22:21:11
【问题描述】:
动机:我正在使用一个没有 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
它有效,但仅在活动窗口上(窗口位于顶部)。我想要的是在后台自动运行窗口。我发现 an article 指向我在 Win32 API 中使用 PostMessage。由于我的大部分代码都使用 python,所以我决定从 powershell 迁移到 pywin32。
问题:我无法让 PostMessage 将密钥发送到正确的处理程序。我在this article 看到我可能需要找到确切的窗口,但我仍然不太明白如何。在 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 上没有提供类似问题的替代方案,所以任何人都应该如何学习“正确的方法”?如果您认为有其他选择,每个人都会很高兴看到解决方案在行动中。请建议对我的帖子进行修改,以提高问题的质量,而不是拒绝。
【问题讨论】:
-
查看winsourcecode.blogspot.com/2019/05/… 列出所有窗口。 winsourcecode.blogspot.com/2020/01/… 此处显示了一种更简单但不太可靠的方法。这是关于窗口而不是进程。您需要发送结果消息而不是密钥。
-
MS-DOS 不再存在。它已经有十多年没有存在了。 Windows 终端(命令)窗口不是 MS-DOS。
-
@KenWhite 感谢您的来信。我编辑了帖子以反映这一点。
-
@Mark 感谢您提供 2 个链接。我现在正在阅读它们。
-
"我发现一篇文章指出我在 Win32 API 中使用 PostMessage" - You can't simulate keyboard input with PostMessage
标签: powershell batch-file winapi pywin32 postmessage