首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >系统托盘访问

系统托盘访问
EN

Stack Overflow用户
提问于 2008-11-05 03:34:35
回答 4查看 1.7K关注 0票数 7

有没有办法(在C#中)访问系统托盘?我不是在说做一个notify图标。我想遍历托盘中的项目(我可能会猜测整个过程,但我不知道如何确定托盘中实际是什么,什么只是一个进程),并在我自己的ui中用图标表示这些项目。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-11-05 08:18:10

你对Win32互操作有何感想?我找到了C/Win32 code,也许能帮你解决这个问题。(实际上,这看起来是一个有趣的问题,所以我可能会尝试自己解决它,只是不是现在)。

神奇之处在于他获得了系统托盘窗口的句柄:

代码语言:javascript
复制
NotifyWnd = FindWindowEx(SysTray, 0, "TrayNotifyWnd", 0);

然后他在它的消息泵上设置了一个钩子:

代码语言:javascript
复制
hHook=SetWindowsHookEx(WH_CALLWNDPROC,HOOKPROC(MsgProc),
         hInstance,dwExplorerThreadId);

然后,在消息泵钩子回调期间,他获得了对有关窗口的一些指针数据的引用:

代码语言:javascript
复制
TWDataT* twd=(TWDataT*)GetWindowLong(NotifyWnd,0);

因此,神秘的是他的循环:

代码语言:javascript
复制
      pTWIconDataT p=COMCTL32_332(twd->iconsInfo,i);

COMCTL32_332是用GetProcAddress定义的,它指向Comctl32.dll的序数332 --根据我在依赖查看器中的检查,这就是DPA_GetPtr,它从一个动态指针数组中获取数据。我不熟悉那里的幕后情况,但这似乎并不是完全不可能的。

我将自己尝试一下,但希望这是一个很好的入门位置。:)

票数 5
EN

Stack Overflow用户

发布于 2008-11-05 04:26:27

Mathias Rauen的madCollection (用于Delphi而不是c#)可以列出Tray Icons

还有一个命令行工具:Windows System Tray Scan Utility

我也用Delphi (不是Delphi.NET)写(没有发布)我自己的程序,没有使用madCollection,它显示托盘图标,进程名称,工具提示和其他信息,但它并不完美。有几个图标它不能显示(尽管它列出了其他信息),而且它不能在windows9x下显示任何图标。我根本没有在Vista下测试过它。

票数 1
EN

Stack Overflow用户

发布于 2008-11-05 09:59:56

在Windows2000中,系统托盘图标位于一个普通的工具栏控件(窗口类"ToolbarWindow32")中,它是"TrayNotifyWnd“窗口的子控件,因此您可以向它发送诸如TB_BUTTONCOUNTTB_GETBUTTON之类的工具栏消息。

不过,您需要小心:像TB_GETBUTTON这样的消息需要指向存储结果的缓冲区的指针,而这个缓冲区需要在SysTray进程本身的中进行。这要求您具有正确的权限,并且使用VirtualAllocEx来分配内存。

我还没有在XP或Vista上尝试过。我想事情已经改变了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/264281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档