Как отправить нажатия клавиш в окно, не активируя его с помощью Windows API? - PullRequest
23 голосов
/ 03 августа 2009

Я уже создал приложение, которое отправляет команды в активированное окно. Я хочу использовать компьютер во время работы моего процесса, потому что как только я переключаю фокус на другое окно, нажатия клавиш, отправляемые с помощью клавиш отправки, переходят в окно, на которое я только что переключился.

В настоящее время я использую FindWindow, IsIconic и ShowWindow из Windows API. Я должен проверить, есть ли окно с FindWindow и установить мой объект на конкретное окно, которое возвращается с этим вызовом, затем я проверяю, свернуто ли оно с помощью IsIconic, и вызвать ShowWindow, если оно есть, и, наконец, мне нужно вызвать Interaction.AppActivate, чтобы установить фокус на это окно. Все это делается еще до того, как я отправляю нажатия клавиш. Похоже, должен быть способ отправлять нажатия клавиш без необходимости показывать окно и активировать его. Самое главное, что когда мое приложение выполняет нажатия клавиш, я ничего не могу сделать на своем компьютере.

Ответы [ 3 ]

30 голосов
/ 05 августа 2009

Хорошо, это немного разочаровывает, я уверен, но вы принципиально не можете сделать это со 100% надежностью.

Windows предполагает, что активное окно является тем, которое получает ввод с клавиатуры. Правильный способ подделки ввода с клавиатуры - SendInput , и вы заметите, что он отправляет сообщения только в активное окно.

При этом вы можете SendMessage WM_KEYUP , WM_CHAR и WM_KEYDOWN и (в зависимости от того, как WndProc их получает) может сойти с рук. Но помните, что сломается при некоторых обстоятельствах, точка.

6 голосов
/ 05 августа 2009

Похоже, вы используете keybd_event () или SendInput (), которые оба посылают нажатия клавиш в текущее активное окно. Чтобы направлять нажатия клавиш в определенное окно, независимо от того, нацелена ли эта вдова или нет, сначала нужно найти ее дескриптор HWND, а затем публиковать в нее сообщения надлежащим образом отформатированного WM_KEYUP / DOWN и WM_CHAR.

1 голос
/ 06 октября 2016

Как только у вас есть окна HWND, вы можете напрямую отправитьMessage () сообщения WM_KEYDOWN и WM_KEYUP в его очередь сообщений. Окно не обязательно должно быть активным.

Однако следует понимать, что это зависит от того, как целевое приложение обрабатывает ввод с клавиатуры. Есть несколько способов справиться с этим.

WM_KEYUP / WM_KEYDOWN является наиболее распространенным, и некоторые приложения обрабатывают только одно или другое (обычно WM_KEYDOWN).

WM_CHAR также довольно распространен

Некоторые программы используют GetAsyncKeyState, GetKeyState или GetKeyboardState. Это чрезвычайно необычно, но эффективно предотвращает инъекцию клавиш с помощью SendMessage (). Если это так, вернитесь к keybd_event (), который напрямую обрабатывается драйвером клавиатуры. Конечно, окно должно быть активным

...