【问题标题】:How to get hidden windows handle of the windows that show hidden system tray icons如何获取显示隐藏系统托盘图标的窗口的隐藏窗口句柄
【发布时间】:2016-02-20 06:58:47
【问题描述】:

我正在尝试用 C# 编写应用程序来捕获按下按钮时出现的隐藏窗口的句柄(“显示隐藏的图标”)。

当我们不显示所有通知区域时,我们会隐藏系统托盘图标。

当我们按下显示它们的按钮(“显示隐藏图标”)时,我们会看到一个新窗口,其中包含所有图标:

用绿色圆圈标记的隐藏窗口

我怎样才能抓住这个隐藏窗口的句柄?

当我使用 Spy++ 时,我找不到这个窗口,因为当我点击键盘上的任何其他键时,窗口就会消失。

所以我找到了按钮的句柄并使用了日志记录选项:

在日志结果中我只看到了常规系统托盘工具栏的窗口句柄:

那么我怎样才能抓住隐藏窗口的句柄(我在我的问题的乞求中用绿色标记的那个,第一张图片)。

参考资料(我找到但对我没有帮助的链接):
How to capture Notification icons properties using Microsoft Spy++
Get information about hidden tray icons in windows7

【问题讨论】:

  • 拥有窗口句柄后你想做什么?
  • @andlabs 我想找到这些图标的关联进程。我知道如何在可见图标上做到这一点:stackoverflow.com/questions/33652756/…
  • @E235:为什么你认为由 shell 创建的(不相关的)窗口会有所帮助?它只是图标的宿主窗口。通知区域中的图标知道要通知哪个窗口。
  • @IInspectable 因为当我拥有图标出现的窗口句柄时,我成功地在可见图标stackoverflow.com/questions/33781788/… 上做到了这一点。所以我相信一旦找到隐藏窗口的句柄,我就能以同样的方式找到它们
  • 这么多的hackery,它伤害了。通过official interface 可以访问可见的通知区域图标。隐藏的图标——顾名思义——是隐藏的。您将无法访问这些内容。

标签: c# c++ winapi spy++


【解决方案1】:

我成功了!

我用 Spy++ 成功捕获了它:

代码解决方案:

static IntPtr GetHiddenSystemTrayHandle()
{
    IntPtr hWndTray = User32.FindWindow("NotifyIconOverflowWindow", null);
    if (hWndTray != IntPtr.Zero)
    {
            if (hWndTray != IntPtr.Zero)
            {
                // Windows caption "Overflow Notification Area"
                hWndTray = User32.FindWindowEx(hWndTray, IntPtr.Zero, "ToolbarWindow32", null);
                return hWndTray;
            }
    }

    return IntPtr.Zero;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    相关资源
    最近更新 更多