Pywin32: win32api.Отправить сообщение в коробочную программу DOS невозможно? - PullRequest
0 голосов
/ 08 октября 2019

Можно ли использовать win32api.SendMessage для отправки символов в программу, которая, кажется, работает в каком-то окне DOS?

В моем диспетчере задач Windows я вижу процесс под названием ntvdm. exe (очевидно, это «Виртуальная машина DOS»). Похоже, что wowexec.exe (= "окна на окнах") и мой target.exe оба "внутри" этого ntvdm.exe , поскольку они имеютнет собственного PID в диспетчере задач. Вместо этого они отображаются с отступом ниже ntvdm.exe .

Я попытался указать все возможные дескрипторы окна для моего target.exe (от родителя = 0 до каждого ребенка) через win32api.SendMessage(<mywindowhandle>, win32con.WM_CHAR, 0x41, 0), но «A» никогда не появляется в программе. SendMessage работает в других программах, таких как блокнот и блокнот ++. Только программа DOS вызывает у меня головную боль.

Использование shell = win32com.client.Dispatch("WScript.Shell") однако в сочетании с shell.AppAcitvate (с использованием PID ntvdm.exe ) и shell.SendKeys работает! Разве это не отправляет сообщения "WM_CHAR" также в фоновом режиме?

1 Ответ

0 голосов
/ 08 октября 2019

Для поддержки множества различных типов приложений Windows NT имеет довольно сложную архитектуру. Вы, очевидно, предполагаете, что WM_CHAR сообщения являются нажатиями клавиш. Это очень образ мышления Win16. WM обозначает оконное сообщение;это событие нажатия клавиши для приложений с окном и насосом сообщений.

С другой стороны, консольные программы не используют насосы сообщений окна;у них есть Unix-стиль Standard In и Standard Out. shell.sendKeys понимает разницу.

Это также означает, что консольная программа не имеет дескриптора окна. PID - это идентификатор процесса, а не дескриптор окна. У процесса может быть 0, 1 или более дескрипторов окна, поэтому для каждого дескриптора окна есть (обычно неуникальный) PID, но не наоборот.

SendKeys работает, потому что оболочка знает все это.

...