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; //delphi/8954