有没有办法(在C#中)访问系统托盘?我不是在说做一个notify图标。我想遍历托盘中的项目(我可能会猜测整个过程,但我不知道如何确定托盘中实际是什么,什么只是一个进程),并在我自己的ui中用图标表示这些项目。
发布于 2008-11-05 08:18:10
你对Win32互操作有何感想?我找到了C/Win32 code,也许能帮你解决这个问题。(实际上,这看起来是一个有趣的问题,所以我可能会尝试自己解决它,只是不是现在)。
神奇之处在于他获得了系统托盘窗口的句柄:
NotifyWnd = FindWindowEx(SysTray, 0, "TrayNotifyWnd", 0);然后他在它的消息泵上设置了一个钩子:
hHook=SetWindowsHookEx(WH_CALLWNDPROC,HOOKPROC(MsgProc),
hInstance,dwExplorerThreadId);然后,在消息泵钩子回调期间,他获得了对有关窗口的一些指针数据的引用:
TWDataT* twd=(TWDataT*)GetWindowLong(NotifyWnd,0);因此,神秘的是他的循环:
pTWIconDataT p=COMCTL32_332(twd->iconsInfo,i);COMCTL32_332是用GetProcAddress定义的,它指向Comctl32.dll的序数332 --根据我在依赖查看器中的检查,这就是DPA_GetPtr,它从一个动态指针数组中获取数据。我不熟悉那里的幕后情况,但这似乎并不是完全不可能的。
我将自己尝试一下,但希望这是一个很好的入门位置。:)
发布于 2008-11-05 04:26:27
Mathias Rauen的madCollection (用于Delphi而不是c#)可以列出Tray Icons。
还有一个命令行工具:Windows System Tray Scan Utility
我也用Delphi (不是Delphi.NET)写(没有发布)我自己的程序,没有使用madCollection,它显示托盘图标,进程名称,工具提示和其他信息,但它并不完美。有几个图标它不能显示(尽管它列出了其他信息),而且它不能在windows9x下显示任何图标。我根本没有在Vista下测试过它。
发布于 2008-11-05 09:59:56
在Windows2000中,系统托盘图标位于一个普通的工具栏控件(窗口类"ToolbarWindow32")中,它是"TrayNotifyWnd“窗口的子控件,因此您可以向它发送诸如TB_BUTTONCOUNT和TB_GETBUTTON之类的工具栏消息。
不过,您需要小心:像TB_GETBUTTON这样的消息需要指向存储结果的缓冲区的指针,而这个缓冲区需要在SysTray进程本身的中进行。这要求您具有正确的权限,并且使用VirtualAllocEx来分配内存。
我还没有在XP或Vista上尝试过。我想事情已经改变了。
https://stackoverflow.com/questions/264281
复制相似问题