删除已知进程ID的程序的系统托盘中的图标

    技术2022-05-20  36

    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;


    最新回复(0)