获取系统托盘的任意一个图标的句柄并隐藏-Delphi教程-第二电脑网

  第二电脑网导读:统托盘某个图标的坐标区域,如果要隐藏某个图标例如音量的图标,也很方便,改改就可以了function GetSysTrayIconRect(Text: string): TRect;{  返回系统托盘中指定文字的图标的矩形区域。  例如返回音量控制图标的矩形区域:  GetSysTrayIconRect('音量');}begin  result := Get...
  正文:请看下面的:


来源:

/// Code By Kingron, 2003
/// 获取托盘某个图标的坐标区域,如果要隐藏某个图标例如音量的图标,也很方便,改改就可以了
function GetSysTrayIconRect(Text: string): TRect;
{
  返回托盘中指定文字的图标的矩形区域。
  例如返回音量控制图标的矩形区域:
  GetSysTrayIconRect('音量');
}

begin
  result := GetToolBarButtonRect(GetSysTrayWnd, Text);
end;

function GetSysTrayWnd: HWND;
{
  返回托盘的句柄,适合于WinXP以上版本
}

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;

function GetToolBarButtonRect(hWnd: HWND; Title: string): TRect;
{
  返回指定工具栏对应的按钮指定文本的矩形区域
  hWnd:工具栏句柄,Title:需要返回矩形区域的按钮文字
  返回值:指定按钮的边界矩形,屏幕坐标
}

var
C, i: integer;
Inf _TBBUTTON;
Item: tagTCITEM;
Buff: PChar;
S: array[0..1024] of char;
PID: THandle;
PRC: THandle;
R: Cardinal;
begin
  FillChar(result, SizeOf(result), 0);
  if hWnd = 0 then Exit;
  GetWindowThreadProcessId(hWnd, @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);
  
  if Format('%d.%d', [Win32MajorVersion, Win32MinorVersion]) >= '5.1' then {// Is or Higher}
  begin
    C := SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0);
    for i := 0 to C - 1 do
    begin
      FillChar(Info, SizeOf(Info), 0);
      WriteProcessMemory(PRC, Buff, @Info, SizeOf(Info), R);
      
      SendMessage(hWnd, TB_GETBUTTON, i, integer(Buff));
      ReadProcessMemory(PRC, Buff, @Info, SizeOf(Info), R);
      
      SendMessage(hWnd, TB_GETBUTTONTEXT, Info.idCommand, integer(integer(@Buff[0]) + SizeOf(Info)));
      ReadProcessMemory(PRC, Pointer(integer(@Buff[0]) + SizeOf(Info)), @S[0], SizeOf(S), R);
      if SameText(StrPas(S), Title) and not Boolean(SendMessage(hWnd, TB_ISBUTTONHIDDEN, Info.idCommand, 0)) then
      begin
        SendMessage(hWnd, TB_GETRECT, Info.idCommand, integer(integer(@Buff[0]) + SizeOf(Info)));
        ReadProcessMemory(PRC, Pointer(integer(@Buff[0]) + SizeOf(Info)), @result, SizeOf(result), R);
        
        Windows.ClientToScreen(hWnd, result.TopLeft);
        Windows.ClientToScreen(hWnd, result.BottomRight);
        
        Break;
      end;
    end;
  end
  else
  begin
    C := SendMessage(hWnd, TCM_GETITEMCOUNT, 0, 0);
    for i := 0 to C - 1 do
    begin
      with Item do
        begin
          mask := TCIF_TEXT;
          dwState := 0;
          dwStateMask := 0;
          cchTextMax := 2048;
          zText := PChar(integer(Buff) + SizeOf(Item) * 4);
          iImage := 0;
          lParam := 0;
        end;
        WriteProcessMemory(PRC, Buff, @Item, SizeOf(Item), R);
        SendMessage(hWnd, TCM_GETITEM, i, Integer(Buff));
        
        ReadProcessMemory(PRC, Buff, @Item, SizeOf(Item), R);
        ReadProcessMemory(PRC, PChar(integer(Buff) + SizeOf(Item) * 4), @S[0], SizeOf(S), R);
        
        if SameText(S, Title) then
        begin
          SendMessage(hWnd, TCM_GETITEMRECT, i, integer(Buff));
          ReadProcessMemory(PRC, Buff, @result, SizeOf(result), R);
          
          Windows.ClientToScreen(hWnd, result.TopLeft);
          Windows.ClientToScreen(hWnd, result.BottomRight);
          Break;
        end;
      end;
    end;
    
    VirtualFreeEx(PRC, Buff, 0, MEM_RELEASE);
    CloseHandle(PRC);
  end;
郑重声明:资讯 【获取系统托盘的任意一个图标的句柄并隐藏-Delphi教程-第二电脑网】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——