【问题标题】:Is there a way of finding uID of a specific application?有没有办法找到特定应用程序的 uID?
【发布时间】:2021-04-29 10:59:18
【问题描述】:

我试图从NOTIFYICONDATA 结构中捕获uID 变量,该结构用于Shell_NotifyIcon 函数(shellapi.h)。我得到了进程窗口的hWnd 和图标的句柄hIcon

应用程序不提供隐藏系统托盘图标的方法。

我期待通过使用Shell_NotifyIconA function NIM_DELETE 执行代码来删除图标,以隐藏特定进程的特定图标我无权访问它的源代码。

我想做什么:

  • 我通过 user32.dll findWindow 函数得到了 hWnd
  • 我通过向 hWnd 发送请求以获取 hIcon 值来获取 hIcon

【问题讨论】:

    标签: c# winapi icons tray shell32


    【解决方案1】:

    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)。

    【讨论】:

    • 那么我基本上需要做什么才能使项目消失?我正在为我的公司工作,该公司拥有来自用户的后台数据接收器,并且出现了一个图标,让他们感到害怕。源代码不在我手中,我必须找到删除图标的方法。我想过执行一个基本上与创建这个图标相反的程序,我想过一个反汇编程序,但我认为它太过分了。
    • 我的意思是说让项目图标消失基本上是删除它。我希望它在后台运行,但在图标托盘中看不到。我的程序在多台计算机上运行。
    猜你喜欢
    • 1970-01-01
    • 2015-03-25
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 2013-02-28
    相关资源
    最近更新 更多