Что может сделать программное обеспечение, чтобы запретить другому приложению вводить сообщения в свое окно с помощью PostMessage? - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь автоматизировать приложение (назовем его 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)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...