Windows 任務列由「開始按鈕」、「應用程式切換區」、「系統通知區(托盤)」與「時鐘」四大區域組成。每個區域都是獨立視窗,擁有各自的類別名稱。只要取得這些視窗控制代碼,即可透過 API 完整控制任務列的顯示/隱藏與啟用/禁用狀態。
| 區域 | 視窗類別名稱 |
|---|---|
| 任務列主視窗 | ShellTrayWnd |
| 開始按鈕 | Button |
| 應用程式切換區 | ReBarWindow32 |
| 系統通知區(托盤) | TrayNotifyWnd |
| 時鐘 | TrayClockWClass |
type
TForm1 = class(TForm)
// 介面元件:5 個 CheckBox 分別對應 5 個區域
// Tag 屬性分別設為 0~4
private
Wnd: array[0..4] of THandle;
procedure GetHandles;
// ...
end;
procedure TForm1.GetHandles;
begin
// 任務列主視窗
Wnd[0] := FindWindow('ShellTrayWnd', nil);
// 開始按鈕
Wnd[1] := FindWindowEx(FindWindow('ShellTrayWnd', nil), 0, 'Button', nil);
// 應用程式切換區
Wnd[2] := FindWindowEx(FindWindow('ShellTrayWnd', nil), 0, 'ReBarWindow32', nil);
// 系統通知區
Wnd[3] := FindWindowEx(FindWindow('ShellTrayWnd', nil), 0, 'TrayNotifyWnd', nil);
// 時鐘(嵌套在 TrayNotifyWnd 內)
Wnd[4] := FindWindowEx(
FindWindowEx(FindWindow('ShellTrayWnd', nil), 0, 'TrayNotifyWnd', nil),
0, 'TrayClockWClass', nil);
end;
procedure TForm1.EnableOrDisable(Sender: TObject);
begin
GetHandles;
if TCheckBox(Sender).Checked then
case TCheckBox(Sender).Tag of
0: EnableWindow(Wnd[0], False);
1: EnableWindow(Wnd[1], False);
2: EnableWindow(Wnd[2], False);
3: EnableWindow(Wnd[3], False);
4: EnableWindow(Wnd[4], False);
end
else
case TCheckBox(Sender).Tag of
0: EnableWindow(Wnd[0], True);
1: EnableWindow(Wnd[1], True);
2: EnableWindow(Wnd[2], True);
3: EnableWindow(Wnd[3], True);
4: EnableWindow(Wnd[4], True);
end;
end;
procedure TForm1.HideOrShow(Sender: TObject);
begin
GetHandles;
if TCheckBox(Sender).Checked then
case TCheckBox(Sender).Tag of
0: ShowWindow(Wnd[0], SW_HIDE);
1: ShowWindow(Wnd[1], SW_HIDE);
2: ShowWindow(Wnd[2], SW_HIDE);
3: ShowWindow(Wnd[3], SW_HIDE);
4: ShowWindow(Wnd[4], SW_HIDE);
end
else
case TCheckBox(Sender).Tag of
0: ShowWindow(Wnd[0], SW_SHOW);
1: ShowWindow(Wnd[1], SW_SHOW);
2: ShowWindow(Wnd[2], SW_SHOW);
3: ShowWindow(Wnd[3], SW_SHOW);
4: ShowWindow(Wnd[4], SW_SHOW);
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var i: Integer;
begin
for i := 0 to 4 do begin
EnableWindow(Wnd[i], True);
ShowWindow(Wnd[i], SW_SHOW);
end;
end;
提醒: 惡意隱藏或禁用任務列可能被視為惡意軟體行為,請僅於合法授權場景使用,並在程式結束時確實恢復系統原狀。