C# 程序关闭托盘图标不会自动消失

57 篇文章 3 订阅

c#程序关闭托盘图标不会自动消失,进程的托盘图标却不能随着进程的结束而自动消失  必须将鼠标移到图标上面时才能消失?  请问如何才能做到图标随着进程的结束而自动消失呢(外部强行结束,如在任务管理器将其结束), windows系统好多程序都会这样。

网上搜索后大家说法不一,如下:

1、这个就这样,很多程序都有这个问题,大家都习惯了

2、似乎没法解决。。任务管理器是强制关闭的,程序认为是异常结束,所以没有执行小图标关闭的操作,当你鼠标移上去的时候,系统找不到进程(因为已关闭),所以就消失了。

3、任务管理器是强制关闭的,程序认为是异常结束,所以没有执行小图标关闭的操作,当你鼠标移上去的时候,系统找不到进程(因为已关闭),所以就消失了。

4、只能习惯!

5、退出时让 托盘 控件不可见..再退出.

6、应用程序操作托盘图标是通过windows的委托来处理的,也就是应用程序对系统说“我要添加一个图标”,于是任务栏就多了个图标,程序退出时对系统说“把我的图标删除了”,任务栏才会消除图标。。。直接砍掉一个进程,那个程序异常退出,还未来得及说“把我的图标删除了”,所以任务栏图标不会立刻消失。。

 

最终结论:

呵呵,这个问题刚开始也困拢了我半天,上网找了很多贴子都没有解决的方法,后来我自己试了一个它的方法,结果一测试完全好用:在程序的closed事件处理程序中调用NotifyIcon控件的Dispose()方法,这样程序退出后托盘上的图标立刻就消失了。
       private void Window_Closed(object sender, EventArgs e)
        {
            myNotifyIcon.Dispose();
        }

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Windows API 中的 Shell_NotifyIcon 函数来给托盘程序发送消息。 首先需要定义一个 NOTIFYICONDATA 的结构体,用于传递托盘图标的信息。示例代码如下: ``` [StructLayout(LayoutKind.Sequential)] public struct NOTIFYICONDATA { public int cbSize; public IntPtr hWnd; public int uID; public int uFlags; public int uCallbackMessage; public IntPtr hIcon; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string szTip; } ``` 其中,cbSize 表示结构体的大小;hWnd 表示托盘程序的窗口句柄;uID 表示托盘图标的 ID;uFlags 表示托盘图标的属性;uCallbackMessage 表示托盘程序接收消息的消息 ID;hIcon 表示托盘图标的句柄;szTip 表示鼠标悬停在托盘图标上时显示的提示文本。 接下来,可以使用 Shell_NotifyIcon 函数来发送消息。示例代码如下: ``` [DllImport("shell32.dll", CharSet = CharSet.Auto)] public static extern bool Shell_NotifyIcon(int dwMessage, ref NOTIFYICONDATA pnid); public const int NIM_ADD = 0x00000000; public const int NIM_MODIFY = 0x00000001; public const int NIM_DELETE = 0x00000002; public const int WM_USER = 0x0400; public const int WM_APP = 0x8000; public void SendMessageToTray(int uID, int uMsg) { NOTIFYICONDATA nid = new NOTIFYICONDATA(); nid.cbSize = Marshal.SizeOf(nid); nid.hWnd = this.Handle; nid.uID = uID; nid.uFlags = 0; nid.uCallbackMessage = WM_USER + uMsg; Shell_NotifyIcon(NIM_MODIFY, ref nid); } ``` 其中,dwMessage 参数表示要执行的操作,可以是 NIM_ADD(添加托盘图标)、NIM_MODIFY(修改托盘图标)或 NIM_DELETE(删除托盘图标);pnid 参数表示托盘图标的信息。在这个示例代码中,SendMessageToTray 方法用于向托盘程序发送消息,uID 参数表示托盘图标的 ID,uMsg 参数表示要发送的消息 ID。 注意,在使用 Shell_NotifyIcon 函数时,必须先将 NOTIFYICONDATA 结构体的 cbSize 字段设置为结构体的大小,以便系统识别结构体的大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值