检测任务栏图标闪烁

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

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


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

但是,你提出的问题存在更大的根本问题,这使得它非常不可取。 想象一下,如果应用程序没有焦点,它会不断闪烁。 你的应用会将其设置为前景。 如果有两个这样的应用程序会发生什么?


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

SetWindowsHookEx(WH_SHELL, hook_proc, NULL, dwPID);

这将HOOKPROChook_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