Программирование систем Windows: Можно ли отправить нажатие клавиши на открытое приложение, которое в данный момент не активно? - PullRequest
2 голосов
/ 27 февраля 2009

Я немного заржавел в системном программировании Windows ...

Возможно ли, чтобы программа отправила нажатие клавиши (я предполагаю, что SendMessage() вызов API) другому приложению, если (открытое) целевое приложение в настоящее время не имеет фокуса? Если это возможно, то делает ли целевое приложение активным или все еще остается в фоновом режиме?

Заранее благодарим за любую информацию, которую вы можете предоставить!

Ответы [ 6 ]

1 голос
/ 06 марта 2010
PostMessage(hwndOther, WM_KEYDOWN, VK_ENTER, 0);

Это работает для меня, но только под Windows XP.

Но на Vista и Windows 7 у меня тоже есть проблема. Вероятно, с UIPI. Я пытаюсь отправить сообщение процессу из DLL, введенной этому процессу.

Как это исправить?

1 голос
/ 27 февраля 2009

Нет, фокус не изменится, если только последующие вызовы не установят фокус. Останется тот же порядок окон

0 голосов
/ 27 февраля 2009

Вам не нужны SendInput () или хуки

Ответ с PostMessage неправильный.

Вы должны прикрепить вашу ветку удаленно. См. Win32 api Group , где это очень классический вопрос (код C, правильный метод MS)

0 голосов
/ 27 февраля 2009

Для направленной отправки нажатий клавиш SendInput является родным методом выбора, хотя он подвергается проверкам UIPI (уровня целостности) в Vista / 2008 / W7. Вы не можете отправлять нажатия клавиш в приложение, у которого есть IL> ваш.

Более общим решением для захвата и перенаправления ввода является глобальная клавиатурная ловушка (см. Справку для SetWindowsHookEx). Но это довольно сложная вещь: вам приходится справляться с тем, как вы отправляете нажатия клавиш, вы влияете на каждый процесс в системе, потому что ваш код эффективно вставляется во входной поток, он включает в себя написание нативной библиотеки DLL ... вы должны знать, именно то, что вы делаете.

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

0 голосов
/ 27 февраля 2009

Да, вы можете отправлять нажатия клавиш, нет, это не приведет к выводу другого окна наверх.

0 голосов
/ 27 февраля 2009

из памяти: да, нет.

Вы ищете WM_KEYDOWN:

PostMessage(hwndOther, WM_KEYDOWN, VK_ENTER, 0);
...