C# 如何自动移去系统托盘失效的图标

hatchgavin 2009-07-01 12:15:13
  有些Window应用程序在启动以后会在系统托盘去添加一个小图标, 一般情况下当程序正常退出时会自动去掉,但有时由于应用程序非法关闭,这个图标便一直留在托盘区,直到用鼠标移动图标上时,才会自己消失发。那么如何用C#实现自动移去系统托盘失效的图标
...全文
583 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
mimixi666 2012-05-17
  • 打赏
  • 举报
回复
我的也有,不过我有个网上下载的代码,他的就不会,关了的话,图标跟着就消失。。不知道为什么。。请问LZ解决这个问题了吗??
whr1314520 2011-10-18
  • 打赏
  • 举报
回复
我的也有这问题
imdavy 2010-06-15
  • 打赏
  • 举报
回复
来看看答案~~
yanlongwuhui 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 hatchgavin 的回复:]
但有时由于应用程序非法关闭,这个图标便一直留在托盘区,直到用鼠标移动图标上时,才会自己消失发
[/Quote]
不只你的软件有这问题,大家都这样
lovelan1748 2009-08-27
  • 打赏
  • 举报
回复
Debug会出这问题
lovelan1748 2009-08-27
  • 打赏
  • 举报
回复
用Relese就没有这问题了
huwei001982 2009-08-27
  • 打赏
  • 举报
回复
这是操作系统层面的, 应用程序又处理不了
czlrongjin 2009-08-27
  • 打赏
  • 举报
回复
学习了,感谢LZ和各位达人!
灵雨飘零 2009-08-27
  • 打赏
  • 举报
回复
退出的时候
notifyIcon1.Dispose();
灵雨飘零 2009-08-27
  • 打赏
  • 举报
回复
退出的时间notifyIcon1.Dispose();
天火 2009-08-27
  • 打赏
  • 举报
回复
学习,并顺便拿些分。
天火 2009-08-27
  • 打赏
  • 举报
回复
学习,并顺便拿些分。
chinahgg 2009-08-27
  • 打赏
  • 举报
回复
!!!!!!!!!!
desegou 2009-07-01
  • 打赏
  • 举报
回复
这个应该是操作系统的问题了,没有及时刷新,鼠标移上去才刷新
柳晛 2009-07-01
  • 打赏
  • 举报
回复
lz是这样退出的?
        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
hztltgg 2009-07-01
  • 打赏
  • 举报
回复
你确定编译好以后运行,没有打开vs的情况下,退出也没有结束图标?如果这样,那你的程序有问题,没有退出,不知道你图标如何加载的?
hatchgavin 2009-07-01
  • 打赏
  • 举报
回复
正常关闭时也是一样的。该程序的系统托盘图标仍在,只有当鼠标移过去图标才消失。我在网上找了C++有这样的。谁能把它改成C#.

如何自动移去系统托盘失效的图标

void __fastcall RemoveDeadIcons()
{
  HWND hTrayWindow;
  RECT rctTrayIcon;
  int nIconWidth;
  int nIconHeight;
  TPoint CursorPos;
  int nRow;
  int nCol;
  // Get tray window handle and bounding rectangle
  hTrayWindow = FindWindowEx(FindWindow(
      "Shell_TrayWnd", NULL), 0, "TrayNotifyWnd", NULL);
  if(!GetWindowRect(hTrayWindow, &rctTrayIcon))
    return;
  // Get small icon metrics
  nIconWidth = GetSystemMetrics(SM_CXSMICON);
  nIconHeight = GetSystemMetrics(SM_CYSMICON);
  // Save current mouse position }
  GetCursorPos(&CursorPos);
  // Sweep the mouse cursor over each icon in the tray in both dimensions
  for(nRow=0; nRow<(rctTrayIcon.bottom-rctTrayIcon.top)/nIconHeight; nRow++)
  {
    for(nCol=0; nCol<(rctTrayIcon.right-rctTrayIcon.left)/nIconWidth; nCol++)
    {
      SetCursorPos(rctTrayIcon.left + nCol * nIconWidth + 5,
          rctTrayIcon.top + nRow * nIconHeight + 5);
      Sleep(0);
    }
  }
  // Restore mouse position
  SetCursorPos(CursorPos.x, CursorPos.x);
  // Redraw tray window (to fix bug in multi-line tray area)
  RedrawWindow(hTrayWindow, NULL, 0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW);
}
柳晛 2009-07-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hztltgg 的回复:]
真异常结束,也不是你这个程序能处理的
[/Quote]
顶。
都结束了,怎么能控制任务栏图标失效呢,Windows就是这样设计的,所有系统指示器图标都会这样。
龙宜坡 2009-07-01
  • 打赏
  • 举报
回复
hztltgg 2009-07-01
  • 打赏
  • 举报
回复
楼主是还在vs里调试的时候发现c#写的代码直接结束后图标没有消失么?那你多虑了,发布了以后就不能随便结束的,真异常结束,也不是你这个程序能处理的
加载更多回复(10)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧