Я пытаюсь автоматизировать приложение (назовем его app.exe), отправляя ему нажатия клавиш.Когда его главное окно открыто и имеет фокус, выполнение ALT + F открывает меню File
.Я проверил все сообщения, отправленные в окно с помощью Spy ++, и тщательно изучил все параметры.
Затем я попытался повторить точно такое же поведение с PostMessage
(чтобы убедиться, что я не отправляюв неправильном окне я даже зацикливаюсь на всех hWnd
, связанных с соответствующим идентификатором процесса):
import win32con, win32gui, win32process, win32api, subprocess, time
def get_hwnds_for_pid(pid):
def callback (hwnd, hwnds):
if win32gui.IsWindowVisible(hwnd) and win32gui.IsWindowEnabled(hwnd):
_, found_pid = win32process.GetWindowThreadProcessId(hwnd)
if found_pid == pid:
hwnds.append(hwnd)
return True
hwnds = []
win32gui.EnumWindows(callback, hwnds)
return hwnds
app = subprocess.Popen(["notepad.exe"])
time.sleep(2.0)
for hwnd in get_hwnds_for_pid(app.pid):
win32gui.SetForegroundWindow(hwnd)
win32api.PostMessage(hwnd, win32con.WM_SYSKEYDOWN, 0x12, 0x20380001) # ALT
win32api.PostMessage(hwnd, win32con.WM_SYSKEYDOWN, 0x46, 0x20210001) # F
time.sleep(1.0)
win32api.PostMessage(hwnd, win32con.WM_KEYUP, 0x46, 0xC0210001)
win32api.PostMessage(hwnd, win32con.WM_KEYUP, 0x12, 0x20380001)
Проблема: это работает, когда приложение - notepad.exe.Но это не удается с другим конкретным приложением, которое я использую (обычное приложение Win32, которое использует QWidget
для основного окна).
Точнее, я вижу подчеркивание _
, подчеркивающеепод первой буквой меню в течение одной секунды (поэтому распознается смоделированный ALT ; обычное поведение в приложении Windows заключается в том, что подчеркнутый F
появляется, когда вы удерживаете кнопку ALT нажатой), но F не распознается.
Еще раз, я PostMessage
отправил в окно точно такие же сообщения, что и в Spy ++, когда я делал горячую клавишу вручную с настоящей клавиатурой.
Вопрос: что может помешать данному программному приложению app.exe получать сообщения, отправленные / введенные из другого приложения (= здесь, мой скрипт на Python)?