首页  编辑  

获取/隐藏系统托盘指定图标

Tags: /超级猛料/OS.操作系统/任务栏/   Date Created:

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

 Info: _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 Windows XP 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;

       pszText := 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;