Windows 10中的托盘按钮手柄

时间:2015-12-05 06:42:01

标签: winapi windows-10 trayicon

我有一个项目是我七年前在Win95开发的,并且在Win7中工作。它是在Visual Studio 2005中开发的。该应用程序查找"您有新的电子邮件"大多数电子邮件应用程序中出现在托盘中(以各种形式)的托盘图标。我用它来闪烁串口上的LED,所以我可以看一下房间,看看我是否有电子邮件,而不是去电脑,移动鼠标唤醒屏幕,查看托盘或电子邮件程序本身。这是一个节省时间和加重减少剂。

通过获取系统托盘手柄,然后使用此手柄,迭代托盘中的所有按钮,并比较特定字符串的按钮文本。以下是Windows 10中出现问题的部分:

        IntPtr hWndTray = GetSystemTrayHandle();
        listBoxIcons.Items.Add(string.Format("Tray handle=0x{0:X}", (int)hWndTray));

        UInt32 count = User32.SendMessage(hWndTray, TB.BUTTONCOUNT, 0, 0);
        listBoxIcons.Items.Add(string.Format("Tray button count={0:D}", count));

对GetSystemTrayHandle()的调用工作正常,我得到一个非null值。对SendMessage(hWndTray,TB.BUTTONCOUNT,...)的调用返回零,即使在我使用的测试用例中,托盘中有九个按钮。 在Windows 10中,"托盘图标"或API调用来获取它们的概念是否已更改? 以下是我正在使用的API调用:

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindowEx(IntPtr hWndParent, IntPtr hWndChildAfter, string lpClassName, string lpWindowName);

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

来自User32.cs:

internal class TB
{
    public const uint GETBUTTON       = WM.USER + 23 ;
    public const uint BUTTONCOUNT     = WM.USER + 24 ;
    public const uint CUSTOMIZE       = WM.USER + 27 ;
    public const uint GETBUTTONTEXTA  = WM.USER + 45 ;
    public const uint GETBUTTONTEXTW  = WM.USER + 75 ;
}

这是GetSystemTrayHandle()方法:

    private IntPtr GetSystemTrayHandle()
    {
        IntPtr hWndTray = FindWindow("Shell_TrayWnd", null);
        if (hWndTray != IntPtr.Zero)
        {
            hWndTray = FindWindowEx(hWndTray, IntPtr.Zero, "TrayNotifyWnd", null);
            if (hWndTray != IntPtr.Zero)
            {
                hWndTray = FindWindowEx(hWndTray, IntPtr.Zero, "SysPager", null);
                if (hWndTray != IntPtr.Zero)
                {
                    hWndTray = FindWindowEx(hWndTray, IntPtr.Zero, "ToolbarWindow32", null);
                    return hWndTray;
                }
            }
        }

        return IntPtr.Zero;
    }

" SendMessage"自从Windows开始以来,调用已存在,因此如果它不再有效,TB.BUTTONCOUNT可能已在Windows 10中重新定义或取代。我找不到任何相关信息。
编辑:在Win98上开发,而不是在Win95上开发。

1 个答案:

答案 0 :(得分:0)

雷米的消息刺激了对通知图标的进一步研究。使用http://www.ghacks.net/2015/03/11/manage-and-display-system-tray-icons-in-windows-10/处的信息找到了答案。启用通知后,例如" email"和"音量,"这个程序,正如所写,现在可以看到它们。