检测通知气球

时间:2010-01-21 12:18:40

标签: windows system-tray popup-balloons

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

在我现在使用的系统(Vista Business SP2)上,气球窗口似乎总是有窗口类#32769(为桌面窗口保留)和窗口样式位TTS_BALLOON设置。

以下可能工作:通过创建临时气球,获取其hWnd并在删除之前调用GetParent()来确定所有通知气球的父窗口。然后,您可以定期轮询此父hwnd的子项(使用EnumWindows()FindWindowEx())查找具有所需类和样式的窗口。

这对我来说似乎非常不便携,并且可能需要在各种平台上进行大量测试。

pinvoke.net和spy ++可能很有用。

祝你好运!

答案 2 :(得分:0)

您肯定需要使用Win API调用来实现此目的。如果这是你要做的唯一事情,你最好不要使用直接的C或C ++,这样你就不必为C#或VB做一堆平台调用。

由于andyjohnson identified所有通知气球的窗口类别为#32769,并且它们设置了TTS_BALLOON样式,因此您可以使用CBT hook(如果您不熟悉)使用Win32钩子,您可能需要read up on them),以便在创建窗口时获得回调,并检查该类的窗口并使用该样式。

但是,我不确定是否为第二个和后续弹出窗口创建了一个新的气球窗口,或者是否隐藏并重新显示了同一个窗口。如果是这种情况,您可能需要CallWndProc hook来获取WM_SHOWWINDOW条消息。

修改

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

因此,您必须在本机(非托管)DLL中构建钩子。可以从这里接口到托管应用程序,例如Michael Kennedy has done on Code Project,但为了正确地执行它,并处理我上面提到的钩子类型,你需要使用进程间通信,迈克尔肯尼迪迈出的一步遗漏了总而言之,出于您所描述的目的,在本机代码中构建整个内容可能会更容易。