Подтвердить что ты не робот

Как отправить штрихи клавиш в окно без необходимости его активации с помощью Windows API?

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

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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