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 DeleltIcon(TargetProcessID) //删除指定进程ID的托盘图标var TargetHwnd: HWND; TBHWND:hwnd; dwProcessID:dword; i, count: Integer; PID, PRC: THandle; Buff: PChar; Info: _TBBUTTON; R: Cardinal; S: array[0..1024] of char;begin TBHWND := GetSysTrayWnd; //得到托盘的窗口ID if TBHWND = 0 then begin showmessage('得到托盘的窗口ID失败'); exit; end; GetWindowThreadProcessId(TBHWND, @PID); //通过托盘窗口ID到得到托盘进程ID PRC := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, PID); //得到托盘进程的句柄 if PRC = 0 then begin showmessage('得到进程的句柄失败'); exit; end; Buff := VirtualAllocEx(PRC, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE); count := SendMessage(TBHWND, TB_BUTTONCOUNT, 0, 0); for i := 0 to count - 1 do begin FillChar(Info, SizeOf(Info), 0); WriteProcessMemory(PRC, Buff, @Info, SizeOf(Info), R);//WriteProcessMemory。 SendMessage(TBHWND, TB_GETBUTTON, i, Integer(Buff)); ReadProcessMemory(PRC, Buff, @Info, SizeOf(Info), R); ReadProcessMemory(PRC, Pointer(Info.dwData), @TargetHwnd, 4, R); GetWindowThreadProcessId(TargetHwnd,@dwProcessID);
if dwProcessID = TargetProcessID then begin SendMessage(TBHWND, TB_DELETEBUTTON, i, 0); break; end; end; VirtualFreeEx(PRC, Buff, 0, MEM_RELEASE); CloseHandle(PRC);end;