Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 检测通知气球_Windows_System Tray_Popup Balloons - Fatal编程技术网

Windows 检测通知气球

Windows 检测通知气球,windows,system-tray,popup-balloons,Windows,System Tray,Popup Balloons,使用WinXP。我需要做的(VB或c#中的pref)是检测另一个(封闭源代码)程序何时在任务栏中显示通知气球,并获取详细信息。任何帮助都将不胜感激。感谢在类似情况下,我使用Microsoft工具Spy++获取窗口信息,然后使用pinvoke调用FindWindow来检测窗口何时存在 我没有尝试过使用通知气球,但我认为对GetText的pinvoke调用将检索内容。我认为您需要使用pinvoke从.net语言执行此操作 在我现在使用的系统(Vista Business SP2)上,气泡窗口似乎总是

使用WinXP。我需要做的(VB或c#中的pref)是检测另一个(封闭源代码)程序何时在任务栏中显示通知气球,并获取详细信息。任何帮助都将不胜感激。感谢

在类似情况下,我使用Microsoft工具Spy++获取窗口信息,然后使用pinvoke调用
FindWindow
来检测窗口何时存在


我没有尝试过使用通知气球,但我认为对
GetText
的pinvoke调用将检索内容。

我认为您需要使用pinvoke从.net语言执行此操作

在我现在使用的系统(Vista Business SP2)上,气泡窗口似乎总是具有窗口类(为桌面窗口保留)和windows样式位TTS_气泡集

以下操作可能会起作用:通过创建临时通知引出序号,获取其hWnd,并在删除之前调用,来确定所有通知引出序号的父窗口。然后,您可以定期轮询此父hwnd的子级(使用或)以查找具有所需类和样式的窗口

这对我来说似乎是高度不可移植的,并且可能需要在各种平台上进行大量测试

spy++可能很有用


祝你好运

您肯定需要使用Win API调用来实现这一点。如果这是你唯一想做的事情,那么最好使用直C或C++,这样你就不必为C++或VB做一系列的平台调用。 由于所有通知引出序号的窗口类都是#32769,并且它们具有
TTS_引出序号
样式集,因此您可以使用(如果您不熟悉Win32钩子,您可能希望),在创建窗口时获取回调,并检查该类的窗口以及该样式的窗口

不过,我不确定是否为第二个和后续弹出窗口创建了一个新的气球窗口,或者是否只是隐藏并重新显示了同一个气球窗口。如果是这种情况,您可能需要一个,以获取
WM\u SHOWWINDOW
消息

编辑:

我应该提到,我提到的钩子不能在.NET中实现。除低级键盘和鼠标挂钩外,全局系统挂钩必须在本机(非托管)DLL中实现。Windows会将此DLL加载到其他进程中,如果托管DLL加载到未加载.NET CLR的进程中,则会使该进程崩溃。(即使加载了CLR,它也可能位于不同的地址,这也会导致崩溃。)


因此,必须在本机(非托管)DLL中构建钩子。从这里连接到托管应用程序是可能的,例如,但是为了正确地执行它,并处理我上面提到的钩子类型,您需要使用进程间通信,这是Michael Kennedy遗漏的一个步骤。总而言之,就您所描述的目的而言,用本机代码构建整个过程可能会更容易。

那么您尝试了什么,发生了什么?我喜欢使用钩子的想法,而不是我建议使用轮询。大概这只适用于非托管代码?@andyjohnson:是的,事实上这很重要,我会更新我的答案来说明这一点。