关于系统托盘图标的小问题

原创 2006年05月18日 17:03:00

    昨天同事写一个进程的守护程序,实时监控另一个进程,如果异常退出则重新加载该进程。问题的描述大致如此。按道理说,通过一个进程来监控另一个进程问题不大。然而被监控进程是一个最小化托盘的程序,在其异常退出后没有自己清除系统托盘里的图标。这样,经过几次异常退出,重新加载的轮回,系统托盘里就快排满了一个足球队的Icon。看上去尉为壮观。

    很多时候我们也有这样的经验,在托盘程序异常退出的时候自身的图标往往不能自我清除,这大多是许多应用程序自身异常检测机制中没有去清除的缘故,但原因也不仅限于此。此时我们用鼠标hover过这些图标区域,哪些dead icon自然就清除掉了。因此我们自然想到了在守护进程中,每次检测到被守护进程异常退出时候,首先将鼠标set过托盘区域,模拟人手操作的过程,最后再复原到原有position。实时说明,这样做的效果是不错的。由于内部处理速度极快,用户根本觉察不到鼠标的移动过程,这样就实现了自动清除dead icon的目的。

    下面把这段儿代码共享一下:

{  刷新系统托盘图标}
procedure RefreshTrayIcon;
var
  TrayWindow : HWnd;
  WindowRect : TRect;
  SmallIconWidth : Integer;
  SmallIconHeight : Integer;
  CursorPos : TPoint;
  Row : Integer;
  Col : Integer;
begin
  { Get tray window handle and bounding rectangle }
  TrayWindow := FindWindowEx(FindWindow('Shell_TrayWnd',NIL),0,'TrayNotifyWnd',NIL);
  if not GetWindowRect(TrayWindow,WindowRect) then Exit;
  { Get small icon metrics }
  SmallIconWidth := GetSystemMetrics(SM_CXSMICON);
  SmallIconHeight := GetSystemMetrics(SM_CYSMICON);
  { Save current mouse position }
  GetCursorPos(CursorPos);
  { Sweep the mouse cursor over each icon in the tray in both dimensions }
  with WindowRect do
    for Row := 0 to (Bottom - Top) DIV SmallIconHeight do
      for Col := 0 to (Right - Left) DIV SmallIconWidth do
        begin
        SetCursorPos(Left + Col * SmallIconWidth, Top + Row * SmallIconHeight);
        Sleep(0);
        end;
  { Restore mouse position }
  SetCursorPos(CursorPos.X,CursorPos.Y);
  { Redraw tray window (to fix bug in multi-line tray area) }
  RedrawWindow(TrayWindow,NIL,0,RDW_INVALIDATE OR RDW_ERASE OR RDW_UPDATENOW);

end;

详解隐藏windows系统托盘图标

曾经写过一篇Windows下的任务栏图标编程 ,其实那篇文章讲的是如何将我们自己的程序最小化到托盘并进行操作的编程方法。前两天看到论坛 里有人讨论如何隐藏托盘图标,记得从前为朋友写过一个隐藏大智慧软件...
  • bzhxuexi
  • bzhxuexi
  • 2014年06月05日 22:13
  • 1625

Java桌面应用程序创建系统托盘图标

/* *Created on 2016年12月8日 *Copyright 2016 Yong Cai Limited crop. All Rights Reserved * *72896**80@qq...
  • caiandyong
  • caiandyong
  • 2016年12月08日 22:04
  • 880

PyQt icon创建,显示 PyQt4 -- 系统托盘图标设置

http://www.cnblogs.com/obbo/articles/2718426.html 痞老板 PyQt4 -- 系统托盘图标设置 转载请...
  • haluoluo211
  • haluoluo211
  • 2015年04月18日 10:46
  • 2193

玩转VC++系统托盘程序(WIN8)

目录(?)[+]          WINDOWS系统托盘是一个特殊区域,通常在桌面的右下角,也就是任务栏的右边。系统常驻在托盘的程序有时钟,音量控制,输入法,网络状态等。第三...
  • u012377333
  • u012377333
  • 2014年11月06日 09:59
  • 864

C#实现系统托盘图标

本文通过向大家介绍一个.Net平台上用C#写的可以停放在任务栏上的图标程序(类似于Flashget、OICQ那种系统托盘图标)来和大家一起体验一下用C#编程的乐趣。 一、概述:   ...
  • ghevinn
  • ghevinn
  • 2013年01月21日 18:46
  • 817

Qt之任务栏系统托盘图标

转自http://blog.csdn.net/qivan/article/details/7506306 托盘图标,一个自己脑子出现很久的词,可惜自己都没动手去实现。最近看见的,听见的多...
  • imxiangzi
  • imxiangzi
  • 2016年09月14日 08:56
  • 693

JFrame实现系统托盘功能缩放在任务栏,窗体图标自定义

窗体设置默认的关闭操作,在很多软件中为避免关闭按钮退出程序,会设定关闭最小化托盘的操作,JFrame同样可实现该功能;另外,自定义的窗体图标导出为jar可执行文件后,常常不显示,解决办法是将图片资源放...
  • renwudao24
  • renwudao24
  • 2016年07月31日 18:14
  • 1073

Java swing 仿QQ实现系统托盘图标(下)

接着上次更新的java swing 仿QQ实现系统托盘图标(上),现在更新下篇,主要为托盘图标的弹出菜单添加菜单项图标。 TrayIcon只能添加PopupMenu弹出菜单,而PopupMenu弹出菜...
  • MH_ANG
  • MH_ANG
  • 2017年07月23日 13:26
  • 793

Java Swing控件桌面程序 显示托盘图标

给Swing程序添加系统图标需要用到两个主要的类:SystemTray和TrayIcon。 SystemTray 通常用于判断系统是否支持托盘图标和添加系统图标功能;TrayIcon 用来创建一...
  • hao5743
  • hao5743
  • 2014年12月10日 13:02
  • 3177

MFC系统托盘的实现

通常电脑里边的软件,当你打开后会在电脑最右下角的任务栏上生成一个系统托盘,当你点击最小化或者点击关闭按钮后,若想恢复窗口,可以左键双击或者单机这个系统图标,同时鼠标右键点击,又会有其他的菜单弹出,比如...
  • u013051748
  • u013051748
  • 2015年05月10日 16:34
  • 1405
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于系统托盘图标的小问题
举报原因:
原因补充:

(最多只允许输入30个字)