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