var TrayHandle : Thandle; begin TrayHandle:=FindWindowEx(FindWindowEx( FindWindowEx( FindWindow('Shell_TrayWnd',nil),0,'TrayNotifyWnd',nil),0,'SysPager',nil),0,'ToolbarWindow32',nil); {XP,2003下} //TrayHandle:=FindWindowEx( FindWindowEx( FindWindow('Shell_TrayWnd',nil),0,'TrayNotifyWnd',nil),0,'ToolbarWindow32',nil);--2000下 SendMessage(TrayHandle,TB_HIDEBUTTON,1,1); //隐藏某个图标 SendMessage(TrayHandle,TB_HIDEBUTTON,1,0); //显示某个图标 end;
获取系统托盘的任意一个图标的句柄并隐藏/// 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 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;
我试过楼上的代码,在win2000我的机器上出了点问题! 怎么一显示,有很多重复的图标?
隐藏系统托盘 procedure hideStartbutton(visi:boolean); {visi 为 True 则显示,False则隐藏} Var Tray, Child : hWnd; C : Array[0..127] of Char; S : String; Begin Tray := FindWindow('Shell_TrayWnd', NIL); Child := GetWindow(Tray, GW_CHILD); While Child <> 0 do Begin If GetClassName(Child, C, SizeOf(C)) > 0 Then Begin S := StrPAS(C); If UpperCase(S) = 'TRAYNOTIFYWND' then begin If Visi then ShowWindow(Child, 1) else ShowWindow(Child, 0); end; End; Child := GetWindow(Child, GW_HWNDNEXT); End; End; 这是隐藏系统托盘的,你可以再搞个热键!:)
TrayHandle : Thandle;
begin
TrayHandle:=FindWindowEx(FindWindowEx( FindWindowEx( FindWindow('Shell_TrayWnd',nil),0,'TrayNotifyWnd',nil),0,'SysPager',nil),0,'ToolbarWindow32',nil);
{XP,2003下}
//TrayHandle:=FindWindowEx( FindWindowEx( FindWindow('Shell_TrayWnd',nil),0,'TrayNotifyWnd',nil),0,'ToolbarWindow32',nil);--2000下
SendMessage(TrayHandle,TB_HIDEBUTTON,1,1); //隐藏某个图标
SendMessage(TrayHandle,TB_HIDEBUTTON,1,0); //显示某个图标
end;
/// 获取系统托盘某个图标的坐标区域,如果要隐藏某个图标例如音量的图标,也很方便,改改就可以了
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;
怎么一显示,有很多重复的图标?
procedure hideStartbutton(visi:boolean);
{visi 为 True 则显示,False则隐藏}
Var
Tray, Child : hWnd;
C : Array[0..127] of Char;
S : String;
Begin
Tray := FindWindow('Shell_TrayWnd', NIL);
Child := GetWindow(Tray, GW_CHILD);
While Child <> 0 do
Begin
If GetClassName(Child, C, SizeOf(C)) > 0 Then
Begin
S := StrPAS(C);
If UpperCase(S) = 'TRAYNOTIFYWND' then
begin
If Visi then ShowWindow(Child, 1)
else ShowWindow(Child, 0);
end;
End;
Child := GetWindow(Child, GW_HWNDNEXT);
End;
End;
这是隐藏系统托盘的,你可以再搞个热键!:)