问题描述
我试图从 NOTIFYICONDATA 结构中捕获 ci-
变量,该结构用于 uID
函数 (shellapi.h)。我得到了进程窗口的 Shell_NotifyIcon
和图标的 hWnd
句柄。
应用程序不提供隐藏系统托盘图标的方法。
我期待通过使用 Shell_NotifyIconA function hIcon
执行代码来删除图标以隐藏特定进程的特定图标我无权访问它的源代码。
我想做什么:
- 我使用 user32.dll findWindow 函数获得了 hWnd
- 我通过向 hWnd 发送请求来获取 hIcon 以获取 hIcon 值
解决方法
Windows 允许用户隐藏他们不关心的图标,没有理由在 WinXP 及更高版本上诉诸黑客。对于旧版本,您可以查看TraySaver。
正式地,托盘项目由 hWnd + ID 或 GUID 标识,但 Windows 也可能关心进程 ID 和/或 exe 名称。如果是这种情况,您将不得不注入流程。
您可以在所述应用程序上使用调试器,只需在 shell32!Shell_NotifyIconW 上设置断点即可找出您感兴趣的应用程序使用的 ID。hIcon 不是身份的一部分。
我刚刚测试过,如果您只知道 HWND 和 ID(假设它不使用 GUID),NIM_DELETE
就可以正常工作。
在 WinDbg 中,打开有问题的 exe 并执行此操作以查找 ID:
> bp shell32!Shell_NotifyIconW
> g
(继续使用 g
直到您进入 Shell_NotifyIconW
)
> dd poi(esp+8)+8 L2 ; .echo _________ ^ID ^Flags
我结束了
0018fba8 00000001 0000000f
_________ ^ID ^Flags
其中 1 是 ID,Flags 不包括 0x20 (GUID)。