一行程式碼實現
procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
end;
原理解析
Application.Handle 為 VCL 應用程式隱藏視窗(TApplication 內部建立),系統以此視窗在工作列建立任務按鈕。
GWL_EXSTYLE 為延伸視窗樣式索引,WS_EX_TOOLWINDOW (0x00000080) 標記視窗為「工具視窗」:不在工作列顯示、不在 Alt+Tab 切換清單、標題列較小、無系統選單圖示。
SetWindowLong 修改樣式即時生效,無需重建視窗。
完整單元程式碼
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
var Form1: TForm1;
implementation {$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
end;
end.
執行效果
適用場景與替代方案
| 場景 | 推薦做法 |
| 背景服務/監控工具 | WS_EX_TOOLWINDOW + 系統托盤圖示 |
| 無介面 Console 應用 | 編譯指令 {$APPTYPE CONSOLE} 或 IsConsole 判斷 |
| 需顯示主視窗但不佔工作列 | 主視窗 FormStyle := fsStayOnTop + 隱藏 Application 任務鈕 |
| 現代 Windows (Vista+) | ITaskbarList3.DeleteTab 精確控制任務列項目 |
注意事項
- 修改
Application.Handle 樣式會影響整個應用程式所有視窗的任務列行為。
- 若需主視窗正常顯示於任務列而隱藏特定對話框,請對該對話框視窗單獨設定
WS_EX_TOOLWINDOW。
- 部分殺毒/監控軟體會將隱藏任務列視為可疑行為,建議簽名發布並說明用途。