что SendMessage использовать для отправки ключей непосредственно в другое окно? - PullRequest
2 голосов
/ 22 февраля 2011

Я пытаюсь использовать SendMessage для отправки ввода с клавиатуры в другое окно. Я знаю недостатки, но я должен это сделать, поскольку мне нужно отправить несколько ключей, и я не могу гарантировать, что окно будет иметь фокус - поэтому это должно работать, когда окно не имеет фокуса.

Я проверяю это, пытаясь отправить ключи в окно блокнота. Я пробовал следующие варианты, и ни один не работал:

def post_keys1(hwnd):
    win32api.SendMessage(
        hwnd, win32con.WM_KEYDOWN, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
    win32api.SendMessage(
        hwnd, win32con.WM_CHAR, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
    win32api.SendMessage(
        hwnd, win32con.WM_KEYUP, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0xC0 << 24))

def post_keys2(hwnd):
    win32api.PostMessage(
        hwnd, win32con.WM_KEYDOWN, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
    win32api.PostMessage(
        hwnd, win32con.WM_CHAR, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
    win32api.PostMessage(
        hwnd, win32con.WM_KEYUP, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0xC0 << 24))

def post_keys3(hwnd):        
    win32api.SendMessage(hwnd, win32con.WM_CHAR,
                         ord('A'), 0)

def post_keys4(hwnd):        
    win32api.PostMessage(hwnd, win32con.WM_CHAR,
                         ord('A'), 0)

def post_keys5(hwnd):        
    win32api.PostMessage(hwnd, win32con.WM_KEYDOWN, ord('A'), 0)
    win32api.PostMessage(hwnd, win32con.WM_CHAR, ord('A'), 0)
    win32api.PostMessage(hwnd, win32con.WM_KEYUP, ord('A'), 0)

def post_keys6(hwnd):
    win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, ord('A'), 0)
    win32api.SendMessage(hwnd, win32con.WM_CHAR, ord('A'), 0)
    win32api.SendMessage(hwnd, win32con.WM_KEYUP, ord('A'), 0)

1 Ответ

6 голосов
/ 22 февраля 2011

Когда я написал вопрос, я понял, что SendKeys - это правильный способ генерировать ввод с клавиатуры, и это единственный способ, который работает во всех случаях. Однако я не смог использовать SendKeys, потому что компьютер, на котором работает моя программа, будет активно использоваться во время работы моей программы, то есть щелчок мыши может произойти в любое время, что изменит фокус окна и сделает SendKeys начать отправку ввода в неправильное окно.

Что я хотел знать, так это то, почему, в частности, мой код не работал - я делал что-то не так с типами сообщений, которые я отправлял? Post против Send? Что должно быть WPARAM? И т.д. ... Ответ, вероятно, был вызван тем, что я отправлял сообщения в окно Блокнота, а не в элемент управления для редактирования, найденный внутри Блокнота - я подозреваю, что это будет работать.

В любом случае, я попытался отправить данные в приложение, над которым я хотел, чтобы оно работало, и это сработало:

def send_input_hax(hwnd, msg):
    for c in msg:
        if c == "\n":
            win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
            win32api.SendMessage(hwnd, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
        else:
            win32api.SendMessage(hwnd, win32con.WM_CHAR, ord(c), 0)

Так что ответ таков: я не делал ничего плохого с точки зрения типов сообщений или содержания сообщения, это было просто неверное назначение.

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