使用WinXP。我需要做的(最好是VB或c#)是检测另一个(闭源)程序何时在托盘中显示通知气球-并获取详细信息。任何帮助都将不胜感激。谢谢
发布于 2010-01-21 20:33:23
在类似的情况下,我使用了微软的工具Spy++来获取窗口信息,然后使用对FindWindow的pinvoke调用来检测窗口是否存在。
我没有尝试过使用通知气球,但我认为对GetText的pinvoke调用将检索内容。
发布于 2010-01-21 22:53:32
我认为您需要在.net语言中使用pinvoke来完成此操作。
在我现在使用的系统(Vista Business SP2)上,气球窗口似乎总是有窗口类#32769 (为桌面窗口保留)和窗口样式位TTS_BALLOON设置。
以下方法可能会起作用:通过创建一个临时通知气球来确定所有通知气球的父窗口,获取它的hWnd,并在删除它之前调用GetParent()。然后,您可以定期轮询这个父hwnd的子节点(使用EnumWindows()或FindWindowEx()),查找具有所需类和样式的窗口。
对我来说,这似乎是高度不可移植的,并且可能需要在各种平台上进行大量测试。
pinvoke.net和spy++可能会很有用。
祝好运!
发布于 2010-01-22 00:21:47
您肯定需要使用Win API调用来实现这一点。如果这是你唯一想做的事情,你最好直接使用C或C++,这样你就不必为C#或VB做一堆平台调用了。
由于andyjohnson identified所有通知气球的窗口类是#32769,并且它们设置了TTS_BALLOON样式,因此您可以使用CBT hook (如果您不熟悉Win32钩子,您可能希望使用read up on them),以便在创建窗口时获取回调,并检查该类和该样式的窗口。
不过,我不确定是否会为第二个或随后的弹出窗口创建一个新的气球窗口,或者是同一个气球窗口只是被隐藏并重新打开。如果是这样的话,您可能需要一个CallWndProc hook来获取WM_SHOWWINDOW消息。
编辑:
我需要指出的是,我提到的钩子不能在.NET中实现,除了低级键盘和鼠标钩子,全局系统钩子必须在本机(非托管)动态链接库中实现。.NET会将此动态链接库加载到其他进程中,如果将托管动态链接库加载到未加载Windows CLR的进程中,则会使该进程崩溃。(即使加载了CLR,它也可能位于不同的地址,也会导致崩溃。)
因此您必须在本机(非托管) DLL中构建挂钩。可以从这里连接到托管应用程序,例如Michael Kennedy has done on Code Project,但要正确地执行此操作,并处理我在上面提到的钩子类型,您需要使用进程间通信,这是Michael肯尼迪遗漏的一个步骤。总而言之,出于您所描述的目的,使用本机代码构建整个代码可能会更容易一些。
https://stackoverflow.com/questions/2109078
复制相似问题