WM_SETFOCUS, получить приложение, которое только что потерял фокус - PullRequest
1 голос
/ 03 марта 2011

Когда мое приложение WTL C ++ активируется или получает фокус клавиатуры, мне нужно определить дескриптор окна приложения, которое ранее было активировано / имело фокус. Однако дескрипторы окна (LPARAM) обоих сообщений WM_SETFOCUS и WM_ACTIVATE имеют значение NULL (XP, 32 бита).

Как я могу определить приложение, которое только что потеряло фокус, когда мое приложение активировано? Есть ли простой способ сделать это или мне нужно будет бросить специальный крюк CBT?

1 Ответ

4 голосов
/ 03 марта 2011

Простой способ точно узнать, какие сообщения отправляются и каковы их параметры, - запустить Spy ++ и установить для него «Журнал сообщений», когда вы нажимаете Alt + Tab в другом окне.

В соответствии с тем, что вымы обнаружили, что lParam для WM_SETFOCUS и WM_ACTIVATE будет NULL, если ранее активное окно (или активное окно) не находится в одном потоке.

Возможно, у вас большеудачи с WM_ACTIVATEAPP, как предположил Дэвид.Как только вы получите идентификатор потока, вы можете попытаться вызвать функцию GetGUIThreadInfo , чтобы определить активное окно для этого потока.Эта функция будет работать, даже если активное окно не принадлежит вызывающему процессу.

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

Если вы не боитесь использовать вещи, которые могут сломаться в будущих версиях Windows, вы можете исследовать функцию RegisterShellHookWindow .Я не могу вам много рассказать об этом, так как никогда не использовал его сам, но это более простой способ получить сообщения оболочки, которые вы в противном случае получили бы, только установив хук.
Это было еще в далеком Windows 2000, ноне был включен в SDK до XP SP1.Насколько я могу судить, он все еще существует в Windows Vista и 7.

...