博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
刷新系统托盘(清除死掉的图标)修正版
阅读量:5983 次
发布时间:2019-06-20

本文共 2880 字,大约阅读时间需要 9 分钟。

刷新系统托盘(清除死掉的图标)修正版  

2009-08-06 18:50:06|  分类: |  标签: |字号 

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 := osME
end;
function GetSysTrayWnd(): HWND;
//返回系统托盘的句柄,适合于Windows各版本
var OS: TOSVersion;
begin
 OS := GetOS;
 Result := FindWindow('Shell_TrayWnd', nil);
 Result := FindWindowEx(Result, 0, 'TrayNotifyWnd', nil);
 if(OS in [osXP, os2K3])then
   Result := FindWindowEx(Result, 0, 'SysPager', nil);
 if(OS in [os2K, osXP, os2K3])then
   Result := FindWindowEx(Result, 0, 'ToolbarWindow32', nil);
end;
procedure RefreshTrayIcon();
//刷新系统托盘图标
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;
===================================
调用RefreshTrayIcon()就OK
[笔记]隐藏指定程序的托盘图标(Delphi版)

突然想到又添加一个把“疯狂刷新”的托盘图标都隐藏的功能。于是百度了半天才弄到一个还可以的实现功能。(添加uses CommCtrl;)

procedure HideAllTrace;

var TBHWND: HWND;
    i, count: Integer;
    PID, PRC: THandle;
    Buff: PChar;
    Info: _TBBUTTON;
    R: Cardinal;
    S: array[0..1024] of char;
begin
    TBHWND := GetSysTrayWnd;
    if TBHWND = 0 then exit;
    GetWindowThreadProcessId(TBHWND, @PID);
    PRC := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, PID);
    Buff := VirtualAllocEx(PRC, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
    count := SendMessage(TBHWND, TB_BUTTONCOUNT, 0, 0); //托盘中button的个数,不一定是图标的个数,有些button是隐藏的。
    for i := 0 to count - 1 do
    begin
        FillChar(Info, SizeOf(Info), 0);
        WriteProcessMemory(PRC, Buff, @Info, SizeOf(Info), R); //消息使用的内存空间必须在Shell之内,所以利用ReadProcessMemoery和WriteProcessMemory。
        SendMessage(TBHWND, TB_GETBUTTON, i, Integer(Buff));
        ReadProcessMemory(PRC, Buff, @Info, SizeOf(Info), R);
        SendMessage(TBHWND, TB_GETBUTTONTEXT, Info.idCommand, Integer(Integer(@Buff[0]) + SizeOf(Info)));
        ReadProcessMemory(PRC, Pointer(Integer(@Buff[0]) + SizeOf(Info)), @S[0], SizeOf(S), R);
        if pos('疯狂刷新', StrPas(S)) > 0 then //如果button的TEXT中包含'疯狂刷新'
            SendMessage(TBHWND, TB_DELETEBUTTON, i, 0); //删除
    end;
    VirtualFreeEx(PRC, Buff, 0, MEM_RELEASE);
    CloseHandle(PRC);
end;

但终因这个功能太猥亵,有点你木马或恶意软件而没有添加到辅助工具里。

转载地址:http://jpeox.baihongyu.com/

你可能感兴趣的文章
【SAP业务模式】之STO(一):业务背景和前台操作
查看>>
HTML5 Canvas玩转酷炫大波浪进度图
查看>>
VB和VB.NET有什么区别
查看>>
TinyXML2 的使用
查看>>
画像分析(1-1)如何为客户画像?
查看>>
鼠标位置距浏览器窗体距离
查看>>
源码编译Tkinter
查看>>
使用Java开发高性能网站需要关注的那些事儿
查看>>
Web.xml配置详解之context-param
查看>>
Codeforces 385 C Bear and Prime Numbers
查看>>
[转]Javascript实现图片的预加载详解
查看>>
大型网站技术架构(四)--网站的高性能架构(转)
查看>>
msf提权命令/meterpreter下的几个命令
查看>>
软件版本
查看>>
1123: 统计难题 (字典树)
查看>>
利用Json_encode解决中文问题
查看>>
Git push 常见用法
查看>>
深入剖析Android四大组件(一)——Activity生命周期具体解释
查看>>
root用户不能改动iptables
查看>>
设计模式一-单例设计模式
查看>>