-1

是否可以使用win32api.SendMessage将字符发送到似乎在某种 DOS 框中运行的程序?

在我的 Windows 任务管理器中,我看到一个名为ntvdm.exe的进程(显然那是“虚拟 DOS 机”)。看起来wowexec.exe(=“windows on windows”)和我的target.exe都在 ntvdm.exe 的“内部” 因为它们在任务管理器中没有自己的 PID。相反,它们在ntvdm.exe下方显示为缩进。

我试图通过我的target.exe(从父级 = 0 到每个子级)定位所有可能的窗口句柄,但“A”从未到达程序中。适用于其他程序,例如记事本和记事本++。只有 DOS 程序让我头疼。win32api.SendMessage(<mywindowhandle>, win32con.WM_CHAR, 0x41, 0)SendMessage

shell = win32com.client.Dispatch("WScript.Shell")然而,结合使用(shell.AppAcitvate使用ntvdm.exe的 PID )并且shell.SendKeys有效!那不是也在后台发送“WM_CHAR”消息吗?

4

1 回答 1

0

为了支持无数不同的应用程序类型,Windows NT 具有相当复杂的体系结构。您显然假设WM_CHAR消息是击键。这在很大程度上是一种 Win16 的思维方式。WM代表窗口消息;对于带有窗口和消息泵的应用程序来说,这是一个击键事件。

另一方面,控制台程序不使用窗口消息泵;他们有 Unix 风格的标准输入和标准输出。shell.sendKeys了解其中的区别。

这也意味着控制台程序没有窗口句柄。PID 是进程标识符,因此不是窗口句柄。一个进程可以有 0、1 或多个窗口句柄,因此对于每个窗口句柄都有一个(通常是非唯一的)PID,但反之则不然。

SendKeys之所以有效,是因为 shell 知道这一切。

于 2019-10-08T09:57:23.413 回答