检测任务栏图标闪烁

我想做一个脚本,检测任务栏图标何时闪烁,并激活一个程序。 我想使用AutoIt或Windows API。

如何检测程序的任务栏图标何时开始闪烁?

要直接回答你的问题, 没有简单的(记录和可靠的)方法来检测窗口的闪烁 。 它由于FlashWindow / FlashWindowEx而发生 。 一个非常干扰和严厉的选择是执行这两个API的全局钩子。 您可以通过向每个用户模式应用程序注入DLL并执行本地钩子/绕道来通知您拥有的某个中央可执行文件。

然而,你提出的问题有一个更深层次的问题,这是非常不可取的。 想象一下,如果应用程序没有焦点,它会不断闪烁。 你的应用程序将其设置为前景。 如果有两个这样的应用程序会发生什么?


Raymond建议使用WH_SHELL钩子并不是太困难,通过调用SetWindowsHookEx来完成:

 SetWindowsHookEx(WH_SHELL, hook_proc, NULL, dwPID); 

这将HOOKPROChook_procdwPID是我们想要关联的线程。 既然你提到你已经知道你想要定位哪个程序,那么我认为你已经有了一个HWND 。 您需要生成dwPID ,可以这样做:

 DWORD dwID = GetWindowThreadProcessId(hwnd, NULL) 

这将使用HWND的相关PID来填充dwPID 。 对于下一步,我假定钩子程序在当前的可执行文件中,而不是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删除您的钩子来进行清理。

使用RegisterShellHookWindow API并侦听HSHELL_FLASH消息。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644989(v=vs.85).aspx