首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 全面控制 Windows 任務列:隱藏、禁用開始按鈕、系統托盤與時鐘

     編輯:Delphi

Windows 任務列由「開始按鈕」、「應用程式切換區」、「系統通知區(托盤)」與「時鐘」四大區域組成。每個區域都是獨立視窗,擁有各自的類別名稱。只要取得這些視窗控制代碼,即可透過 API 完整控制任務列的顯示/隱藏與啟用/禁用狀態。

核心程式設計思路

1. 任務列各區域視窗類別名稱

區域視窗類別名稱
任務列主視窗ShellTrayWnd
開始按鈕Button
應用程式切換區ReBarWindow32
系統通知區(托盤)TrayNotifyWnd
時鐘TrayClockWClass

2. 關鍵 API 流程

  1. FindWindow 取得任務列主視窗控制代碼。
  2. FindWindowEx 遞迴取得各子區域控制代碼。
  3. ShowWindow 控制顯示/隱藏(SW_HIDE / SW_SHOW)。
  4. EnableWindow 控制啟用/禁用(True / False)。

完整實作程式碼

1. 定義控制代碼陣列與取得控制代碼程序

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;

2. 啟用/禁用控制程序

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;

3. 顯示/隱藏控制程序

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;

4. 表單關閉時恢復任務列原狀

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;

應用場景與注意事項

  • 適用於 全螢幕教學/簡報軟體、考試鎖定瀏覽器、數位看板 等需隱藏系統 UI 的場合。
  • 本範例在 Delphi 3.0/4.0 + Windows 95/98/2000 測試通過;新版 Windows(Vista 以降)因 DWM 與 UAC 機制,部分區域可能需更高權限或不同類別名稱。
  • 同樣適用於 VB、VC、C++Builder 等工具,僅語法與型別宣告略有差異。

提醒: 惡意隱藏或禁用任務列可能被視為惡意軟體行為,請僅於合法授權場景使用,並在程式結束時確實恢復系統原狀。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved