我有一个项目是我七年前在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上开发。
答案 0 :(得分:0)
雷米的消息刺激了对通知图标的进一步研究。使用http://www.ghacks.net/2015/03/11/manage-and-display-system-tray-icons-in-windows-10/处的信息找到了答案。启用通知后,例如" email"和"音量,"这个程序,正如所写,现在可以看到它们。