gpt4 book ai didi

c# - 在 C# 中隐藏另一个应用程序的系统托盘

转载 作者:太空宇宙 更新时间:2023-11-03 13:49:14 24 4
gpt4 key购买 nike

好的,这是最后一次尝试,我正在尝试解决 URL 下方详述的问题。我已经查看了 URL 中详细介绍的文章,但我仍然无法隐藏相关图标。有人有什么想法吗?

http://www.codeproject.com/Articles/10807/Shell-Tray-Info-Arrange-your-system-tray-icons

http://social.msdn.microsoft.com/Forums/da/vbgeneral/thread/a11faa45-a3ea-4060-8de4-a6bc22e1516d

I want to be able to hide the system tray icon that is loaded by Windows speech recognition (comes as part of Windows 7 and Windows 8 and Windows Vista). I need to do it in C# and have been trying Google solutions for the last couple of days to no avail. It seems the best way forward would be to use this code:

//上面定义的NotifyIconData结构

private void button1_Click(object sender, EventArgs e)
{
NOTIFYICONDATA pnid = new NOTIFYICONDATA();
pnid.uCallbackMessage = 0x800;
pnid.uFlags = 1;
pnid.hwnd = ???;
pnid.uID = 1;
pnid.szTip = null;
pnid.uFlags |= 2;
pnid.hIcon = ???;
pnid.uFlags |= 4;
pnid.szTip = "Speech Recognition is listening";

bool b = Shell_NotifyIcon(2, ref pnid);

Shell_NotifyIcon API 函数(2)的第一个参数是删除。问题是我不知道如何找到带有问号的参数,包括图标句柄。我尝试使用 ExtractIcon 使用窗口语音识别快捷方式指示的可执行文件和任务管理器文件位置 (%windir%\Speech\Common\sapisvr.exe -SpeechUX) 指示的文件位置,但它告诉我可执行文件具有没有关联的图标。我还使用我下载的免费应用程序验证了它,以检查该可执行文件的图标,它说了同样的话。

我可以使用以下方法获取图标托盘的窗口句柄:

    IntPtr hWnd = Win32API.FindWindow("Shell_TrayWnd", null);
if(hWnd.ToInt32() > 0)
{
hWnd = Win32API.FindWindowEx(hWnd, IntPtr.Zero, "TrayNotifyWnd", null);
if (hWnd.ToInt32() > 0)
{
hWnd = Win32API.FindWindowEx(hWnd,IntPtr.Zero, "SysPager", null);
if (hWnd.ToInt32() > 0)
{
hWnd = Win32API.FindWindowEx(hWnd, IntPtr.Zero, "ToolbarWindow32", null);
}
// count = Win32API.SendMessage(hWnd, 1048 , 0, 0);
}
}

但是,即使有了句柄和图标的数量,我也不知道如何枚举图标句柄。

如果有人能用 C# 给我一个可行的解决方案,我很乐意支付咨询费用,就像我说的那样,您可以通过加载 Windows 7 和 Windows 8 免费提供的 Windows 语音识别来轻松尝试,您会看到图标 I意思是。我可以接受 C++ 解决方案,但它必须完全在托管 C++ (.NET) 中

最佳答案

[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);

static 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;
}

获得窗口句柄后,您可以选择遍历进程以找到系统托盘中的进程,并使用它们执行任何需要的工作:

using System.Diagnostics;
Process [] processes = System.Diagnostics.Process.GetProcesses();

foreach (System.Diagnostics.Process process in processes)
{
if (process.MainWindowHandle == hWndTray)
{
// ...
}
}

关于c# - 在 C# 中隐藏另一个应用程序的系统托盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14225660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com