Простой способ точно узнать, какие сообщения отправляются и каковы их параметры, - запустить Spy ++ и установить для него «Журнал сообщений», когда вы нажимаете Alt + Tab в другом окне.
В соответствии с тем, что вымы обнаружили, что lParam
для WM_SETFOCUS
и WM_ACTIVATE
будет NULL
, если ранее активное окно (или активное окно) не находится в одном потоке.
Возможно, у вас большеудачи с WM_ACTIVATEAPP
, как предположил Дэвид.Как только вы получите идентификатор потока, вы можете попытаться вызвать функцию GetGUIThreadInfo
, чтобы определить активное окно для этого потока.Эта функция будет работать, даже если активное окно не принадлежит вызывающему процессу.
Если ваше приложение - это что-то кроме небольшой утилиты, которую пользователь не должен открывать и запускать очень долго, я быизбегать использования крюка CBT, если это вообще возможно, учитывая потенциальные последствия для производительности.К сожалению, подобное взаимодействие через границы процесса затруднительно.
Если вы не боитесь использовать вещи, которые могут сломаться в будущих версиях Windows, вы можете исследовать функцию RegisterShellHookWindow
.Я не могу вам много рассказать об этом, так как никогда не использовал его сам, но это более простой способ получить сообщения оболочки, которые вы в противном случае получили бы, только установив хук.
Это было еще в далеком Windows 2000, ноне был включен в SDK до XP SP1.Насколько я могу судить, он все еще существует в Windows Vista и 7.