/// 获取系统托盘某个图标的坐标区域,如果要隐藏某个图标例如音量的图标,也很方便,改改就可以了
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 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;
TCM_ADJUSTRECT TB_ADDBITMAP TB_SETTOOLTIPS
TCM_DELETEALLITEM TB_ADDBUTTONS TB_GETMAXSIZE
TCM_DELETEITEM TB_ADDSTRING TB_GETOBJECT
TCM_DESELECTALL TB_AUTOSIZE TB_GETPADDING
TCM_GETCURFOCUS TB_BUTTONCOUNT TB_GETRECT
TCM_GETCURSEL TB_BUTTONSTRUCTSIZE TB_GETROWS
TCM_GETEXTENDEDSTYLE TB_CHANGEBITMAP TB_GETSTATE
TCM_GETIMAGELIST TB_CHECKBUTTON TB_GETSTYLE
TCM_GETITEM TB_COMMANDTOINDEX TB_GETTEXTROWS
TCM_GETITEMCOUNT TB_CUSTOMIZE TB_GETTOOLTIPS
TCM_GETITEMRECT TB_DELETEBUTTON TB_HIDEBUTTON
TCM_GETROWCOUNT TB_ENABLEBUTTON TB_HITTEST
TCM_GETTOOLTIPS TB_GETANCHORHIGHLIGHT TB_INDETERMINATE
TCM_HIGHLISHTITEM TB_GETBITMAP TB_INSERTBUTTON
TCM_HITTEST TB_GETBITMAPFLAGS TB_INSERTMARKHITTEST
TCM_INSERTITEM TB_GETBUTTON TB_ISBUTTONCHECKED
TCM_REMOVEIMAGE TB_GETBUTTONINFO TB_ISBUTTONENABLED
TCM_SETCURFOCUS TB_GETBUTTONSIZE TB_ISBUTTONHIDDEN
TCM_SETCURSEL TB_GETBUTTONTEXT TB_ISBUTTONHIGHLIGHTED
TCM_SETEXTENDEDSTYLE TB_GETDISABLEDIMAGELIST TB_ISBUTTONINDETERMINATE
TCM_SETIMAGELIST TB_GETEXTENDEDSTYLE TB_ISBUTTONPRESSED
TCM_SETITEM TB_GETHOTIMAGELIST TB_LOADIMAGES
TCM_SETITEMEXTRA TB_GETHOTITEM TB_MAPACCELERATOR
TCM_SETITEMSIZE TB_GETIMAGELIST TB_MARKBUTTON
TCM_SETMINTABWIDTH TB_GETINSERTMARK TB_MOVEBUTTON
TCM_SETPADDING TB_GETINSERTMARKCOLOR TB_PRESSBUTTON
TCM_SETTOOLTIPS TB_GETITEMRECT TB_REPLACEBITMAP
TB_SAVERESTORE TB_SETANCHORHIGHLIGHT TB_SETBITMAPSIZE
TB_SETBUTTONINFO TB_SETBUTTONSIZE TB_SETBUTTONWIDTH
TB_SETCMDID TB_SETDISABLEDIMAGELIST TB_SETEXTENDEDSTYLE
TB_SETHOTIMAGELIST TB_SETHOTITEM TB_SETIMAGELIST
TB_SETINDENT TB_SETINSERTMARK TB_SETINSERTMARKCOLOR
TB_SETMAXTEXTROWS TB_SETPADDING TB_SETPARENT
TB_SETROWS TB_SETSTATE TB_SETSTYLE
uses CommCtrl;