Windows / C ++: определить, когда фокус изменился между окнами (глобально) - PullRequest
1 голос
/ 03 июня 2010

Я пытаюсь найти способ определить, когда фокус меняется на другое окно (без необходимости опроса каждые X мс).

Я уже нашел способ определить, когда фокус переключается между приложениями, используя WH_SHELL и HSHELL_ACTIVATESHELLWINDOW.

Проблема в том, что я хочу обнаружить, когда фокус переключается между диалоговым окном / окном в одном приложении.

есть. В «Блокноте» я могу определить, когда приложение переключается на «Блокнот», но не могу определить, когда появляются диалоговые окна «Открыть» или «Сохранить», потому что фокус остается в том же приложении.

Ответы [ 3 ]

3 голосов
/ 03 июня 2010

Вы можете использовать SetWindowsHookEx с типом хука WH_CBT. Если вы просто хотите обнаружить изменения фокуса в приложении, передайте GetCurrentThreadId () в качестве последнего параметра, иначе перехват будет для всех потоков на текущем рабочем столе.

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

1 голос
/ 16 апреля 2013

Извините за задержку, у меня не установлен VS на этом компьютере, поэтому найти код немного сложно.

Используйте это, чтобы подключить ваш код к системе.

HHOOK oldShellHook = SetWindowsHookEx(WH_SHELL, BCK_WndShellProc, hDll, NULL);

if (!info->oldShellHook) {
    MessageBox(m_hwnd, L"Failed to load global hook.", strTitle, MB_OK | MB_ICONERROR);
    return;
}

А это твой крючок. В зависимости от того, что вы делаете, используйте nMsg, чтобы выяснить, когда вы хотите применить свою собственную логику.

LRESULT CALLBACK BCK_WndShellProc(int nMsg, WPARAM wParam, LPARAM lParam) {
    ...
}

Прочтите документы MSDN для SetWindowsHookEx () , чтобы убедиться, что вы возвращаете ожидаемые значения, в противном случае вы можете заблокировать всю систему.

Я использую код, подобный этому, в моих Breadcrumb Killer и Spasm (Показать все программы в меню Пуск), и кажется, что он работает нормально.

0 голосов
/ 03 июня 2010

А как насчет "Компьютерное обучение API"; SetWindowsHookEx с WH_CBT, что позволит вам получить HCBT_SETFOCUS ( среди прочих )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...