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;