有没有办法找到特定应用程序的 uID?

问题描述

我试图从 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)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...