2012-02-16 7 views
3

Я хочу создать скрипт, который обнаруживает, когда значок панели задач мигает и активирует программу. Я хотел бы использовать AutoIt или Windows API.Обнаружение значка на панели задач мигает

Как определить, когда начинает мигать значок панели задач программы?

+7

Это не имеет смысла. Кнопка мигает, потому что программа пыталась нажать свое окно на переднем плане, когда пользователь занят, используя окно. Предотвращение этого фокуса * сильно * предпочитается пользователями. Google SPI_SETFOREGROUNDLOCKTIMEOUT, если вы хотите проигнорировать это. –

+0

Вы можете просто создать 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

ответ

2

Чтобы ответить на ваш вопрос напрямую, нет простого (документированного и надежного) способа обнаружения вспышки окна. Это происходит в результате 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.

+0

Мне только заботится об одной конкретной программе, которая будет мигать, так что проблема никогда не возникнет. Вы могли бы пролить свет на то, как вводить DLL в приложения? Я не совсем уверен, что это за крючок. – Michael

Смежные вопросы