Чтобы ответить на ваш вопрос напрямую, нет простого (документированного и надежного) способа обнаружения вспышки окна. Это происходит в результате FlashWindow/FlashWindowEx. Очень навязчивым и жестким вариантом является глобальная привязка обоих API. Вы можете сделать это, введя DLL в каждое приложение usermode и выполнив локальный крюк/обход, который уведомляет вас о центральном исполняемом файле.
Однако существует большая проблема с тем, что вы предлагаете, что делает его крайне нежелательным. Представьте приложение, которое постоянно мигает, когда оно не имеет фокуса. Ваше приложение установит его на передний план. Что произойдет, если будет two such applications?
Используя WH_SHELL
крючок, как Раймонд говорит не слишком сложно и делается вызовом SetWindowsHookEx, как так:
SetWindowsHookEx(WH_SHELL, hook_proc, NULL, dwPID);
Это создает оболочку крючок с HOOKPROC
как hook_proc
и dwPID
это нить, которая мы хотим связать крючок с. Поскольку вы упоминаете, что уже знаете, какую программу вы хотите настроить, я предположим, что у вас уже есть HWND
. Вы должны генерировать dwPID
, что может быть сделано, как так:
DWORD dwID = GetWindowThreadProcessId(hwnd, NULL)
Это заполнит dwPID
с соответствующим PID в HWND
. Для следующего шага я предполагаю, что процедура hook должна находиться в текущем исполняемом файле, а не в DLL. Подключаемая процедура может быть что-то вроде этого:
LRESULT CALLBACK hook_proc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode == HSHELL_REDRAW && lParam){
SetForegroundWindow(hwnd); // assumed hwnd is a global
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
выше код не был проверен и может содержать ошибки, но должно дать вам общее представление о том, что делать.
Следует отметить, что SetWindowHookEx
необходимо вызвать из программы с той же бичностью, что и цель. то есть, если ваша цель равна 64 бит, вызывающий абонент SetWindowHookEx
также должен быть 64 бит. Кроме того, после того, как вы закончите, вы должны очистить, сняв крючок с UnhookWindowsHookEx.
Это не имеет смысла. Кнопка мигает, потому что программа пыталась нажать свое окно на переднем плане, когда пользователь занят, используя окно. Предотвращение этого фокуса * сильно * предпочитается пользователями. Google SPI_SETFOREGROUNDLOCKTIMEOUT, если вы хотите проигнорировать это. –
Вы можете просто создать PixelSearch в своей области панели задач (найти с помощью: '$ taskbar = WinGetHandle (" [Класс: Shell_TrayWnd] ")', '$ taskbarPos = WinGetPos ($ taskbar)', '$ tasklistPos = ControlGetPos ($ taskbar , "", "[CLASS: MSTaskListWClass; INSTANCE: 1]") '), например' PixelSearch ($ taskbarPos [0] + $ tasklistPos [0], $ taskbarPos [1] + $ tasklistPos [1], $ taskbarPos [0 ] + $ tasklistPos [2], $ taskbarPos [1] + $ tasklistPos [3], 0x00CCCC00) 'с' 0x00CCCC00' в том, что оранжевый цвет вспышки ... поиск постоянной видимости. – Samoth