【问题标题】:Detecting Notification Balloons检测通知气球
【发布时间】:2010-01-21 12:18:40
【问题描述】:

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

【问题讨论】:

  • 那么你尝试了什么,发生了什么?

标签: windows system-tray popup-balloons


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    祝你好运!

    【讨论】:

      【解决方案3】:

      您肯定需要使用 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,但要正确执行并处理我上面提到的钩子类型,您需要使用进程间通信,这是 Michael Kennedy 遗漏的步骤.总而言之,就您所描述的目的而言,使用本机代码构建整个东西可能会更容易。

      【讨论】:

      • 我喜欢使用钩子的想法——比我使用轮询的建议要好。大概这只能在非托管代码中工作?
      • @andyjohnson:是的,事实上这很重要,我会更新我的答案以明确这一点。
      猜你喜欢
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 2021-06-09
      相关资源
      最近更新 更多