回答
要直接回答您的问题,没有简单的(记录和可靠的)方法来检测窗口的闪烁。它由于FlashWindow/FlashWindowEx而发生。一个非常干扰和严厉的选择是执行两个API的全局钩子。您可以通过向每个用户模式应用程序注入DLL并执行本地钩子/绕道来通知您拥有的某个中央可执行文件。
但是,您提出的问题存在更大的潜在问题,这使得它非常不可取。想象一下,如果应用程序没有焦点,它会不断闪烁。你的应用会将其设置为前景。如果有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
与HWND
的关联PID。对于下一步,我假定钩子过程在当前可执行文件中,而不是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的钩子进行清理。
我只关心一个会闪烁的特定程序,所以这个问题永远不会出现。你将能够阐明如何将DLL注入到应用程序中吗?我不太清楚钩子是什么。 – Michael 2012-02-17 23:45:15
使用RegisterShellHookWindow API并侦听HSHELL_FLASH消息。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644989(v=vs.85).aspx
- 1. 停止任务栏闪烁
- 2. AIR:使任务栏项闪烁?
- 3. 如何检测何时使用WndProc闪烁模式标题栏?
- 4. Winforms在任务栏上绘制图像时闪烁
- 5. 有没有一种方法可让Eclipse在任务耗尽任务完成后闪烁其任务栏图标?
- 6. CSS/jQuery:让图标闪烁
- 7. 在任务栏中导致橙色闪烁的应用程序
- 8. 在颜色变化的任务栏中闪烁
- 9. 其他应用程序的控制任务栏闪烁事件
- 10. 开关Application.Mainform并调用MainformOnTaskBar原因闪烁Windows任务栏
- 11. 如何避免在.net winforms任务栏上闪烁?
- 12. 全屏闪烁任务栏Windows Mobile 6应用程序
- 13. 使用Java闪烁任务栏(a la pidgin || MSN)
- 14. 如何检测窗口是否闪烁
- 15. OpenCV的检测闪烁的灯光
- 16. 如何使网页中的图标闪烁/闪烁
- 17. 检测Win +标签任务视图
- 18. 在任务栏无图标
- 19. jQuery标题闪烁
- 20. winforms标签闪烁
- 21. 当javafx模态对话框失去焦点时,在任务栏中闪烁应用程序图标
- 22. 图像不闪烁
- 23. C#图形闪烁
- 24. DataGridViewImageColumn,图像闪烁
- 25. 绘图不闪烁
- 26. jquery图片闪烁?
- 27. UIAlertViewController闪烁/闪烁简要
- 28. Symfony OutputFormatterStyle“闪烁”不闪烁
- 29. 停止闪烁从闪烁
- 30. 闪烁或闪烁bgcolor
这没有意义。一个按钮闪烁,因为当用户忙于使用窗口时,程序试图在前台推窗。用户非常喜欢防止这种焦点窃取。 Google SPI_SETFOREGROUNDLOCKTIMEOUT如果你想忽略它。 – 2012-02-16 04:46:12
你可以在你的任务栏区域做一个PixelSearch(可以找到:'$ taskbar = WinGetHandle(“[Class:Shell_TrayWnd]”)','$ taskbarPos = WinGetPos($ taskbar)','$ tasklistPos = ControlGetPos($ taskbar ($ taskbarPos [0] + $ tasklistPos [0],$ taskbarPos [1] + $ tasklistPos [1],$ taskbarPos [0],“”,“[CLASS:MSTaskListWClass; INSTANCE:1]”)') ] + $ tasklistPos [2],$ taskbarPos [1] + $ tasklistPos [3],0x00CCCC00)''0x00CCCC00'就是橙色的闪光颜色......寻找一个不断的发生。 – Samoth 2012-02-20 22:39:22