检测任务栏图标闪烁
我想制作一个脚本来检测任务栏图标何时闪烁,并激活一个程序。 我想使用AutoIt或Windows API。
如何检测程序的任务栏图标何时开始闪烁?
要直接回答您的问题,没有简单的(记录和可靠的)方法来检测窗口的闪烁。 它由于FlashWindow / FlashWindowEx而发生。 一个非常干扰和严厉的选择是执行两个API的全局钩子。 您可以通过向每个用户模式应用程序注入DLL并执行本地钩子/绕道来通知您拥有的某个中央可执行文件。
但是,你提出的问题存在更大的根本问题,这使得它非常不可取。 想象一下,如果应用程序没有焦点,它会不断闪烁。 你的应用会将其设置为前景。 如果有两个这样的应用程序会发生什么?
Raymond建议使用WH_SHELL
钩子并不是太困难,而是通过调用SetWindowsHookEx来完成:
SetWindowsHookEx(WH_SHELL, hook_proc, NULL, dwPID);
这将HOOKPROC
为hook_proc
并且dwPID
是我们想要将钩子与之关联的线程。 既然你提到你已经知道你想要定向哪个程序,我会假设你已经有了一个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
链接地址: http://www.djcxy.com/p/51813.html上一篇: Detect a taskbar icon flashing
下一篇: Changing the icon shown in a taskbar group for a multi window application