本文整理自网络,侵删。
用TerminateProcess把一个进程结束后有个问题,就是如果该程序在托盘有图标的话,这个图标并不会在它被结束时也消失。当然你用鼠标从上面移过可以解决这个问题,但本人在用自己的刷新辅助软件“疯狂刷新”的时候,每5分钟结束一次,一天下来如果不动电脑,就会在托盘区生成NNN个死图标,即使你拚命去点,也要点半天才能全部消除。有没有办法一下子搞定它呢?答案是肯定的,在网上搜了很久……用Delphi编写几行代码搞定。
添加自定义类型,用作判断系统类型,type TOSVersion = (osUnknown, os95, os98, osME, osNT3, osNT4, os2K, osXP, os2K3);
添加自定义函数过程function GetOS: TOSVersion; //获得系统类型,用来取得托盘句柄var OS: TOSVersionInfo;begin ZeroMemory(@OS, SizeOf(OS)); OS.dwOSVersionInfoSize := SizeOf(OS); GetVersionEx(OS); Result := osUnknown; if OS.dwPlatformId = VER_PLATFORM_WIN32_NT then begin case OS.dwMajorVersion of 3: Result := osNT3; 4: Result := osNT4; 5: begin case OS.dwMinorVersion of 0: Result := os2K; 1: Result := osXP; 2: Result := os2K3; end; end; end; end else if (OS.dwMajorVersion = 4) and (OS.dwMinorVersion = 0) then Result := os95 else if (OS.dwMajorVersion = 4) and (OS.dwMinorVersion = 10) then Result := os98 else if (OS.dwMajorVersion = 4) and (OS.dwMinorVersion = 90) then Result := osMEend;
function GetSysTrayWnd: HWND; // 得到系统托盘的句柄 begin Result := FindWindow('Shell_TrayWnd', nil); Result := findwindowex(Result, 0, 'TrayNotifyWnd', nil); Result := findwindowex(Result, 0, 'SysPager', nil); Result := findwindowex(Result, 0, 'ToolbarWindow32', nil); end;
procedure KillTrayIcons (Sender: TObject);var hwndTrayToolBar: HWND; rTrayToolBar: tRect; x, y: Word;begin hwndTrayToolBar := GetSysTrayWnd; Windows.GetClientRect(hwndTrayToolBar, rTrayToolBar); for x := 1 to rTrayToolBar.right - 1 do begin for y := 1 to rTrayToolBar.bottom - 1 do begin SendMessage(hwndTrayToolBar, WM_MOUSEMOVE, 0, MAKELPARAM(x, y)); end; end;end;
//调用 KillTrayIcons(self) 过程就可以瞬间清除所有无用的托盘图标了。
相关阅读 >>
Delphi中的copy,delete,pos和leftstr,rightstr的用法
Delphi xe 取得 app 自己的版本号 (狠跨 4 个平台)
Delphi xe intraweb 程序在iis下的发布详细教程
Delphi 如何在程序中动态设置墙纸(使用iactivedesktop接口)
Delphi 将string 转为 array of ansichar
更多相关阅读请进入《Delphi》频道 >>