【问题标题】:Pywin32: win32api.SendMessage to a DOS box program not possible?Pywin32:无法将 win32api.SendMessage 发送到 DOS 框程序?
【发布时间】:2019-10-08 08:59:13
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: winapi pywin32 wscript.shell


    【解决方案1】:

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

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

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

    SendKeys 有效,因为 shell 知道这一切。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-25
      • 2022-01-21
      • 2017-01-03
      • 1970-01-01
      • 2021-04-28
      • 2012-03-09
      • 2016-06-14
      • 1970-01-01
      相关资源
      最近更新 更多