後台監控軟體需滿足三大核心需求:任務列/管理器隱藏、系統托盤/無介面運行、全域熱鍵喚醒管理介面。Delphi 透過 RegisterServiceProcess (Windows 9x) 或建立服務應用程式 (NT 核心)、RegisterHotKey 實現。本文提供 Windows 9x/2000/XP 相容的完整表單應用程式實作。
| 需求 | 技術方案 | 適用平台 |
|---|---|---|
| 隱藏任務管理器進程列表 | RegisterServiceProcess(GetCurrentProcessId, RSP_SIMPLE_SERVICE) | Windows 95/98/Me |
| 隱藏 NT 核心任務管理器 | 建立 **Windows 服務應用程式** (Service Application),非表單應用 | Windows 2000/XP/2003/Vista+ |
| 全域熱鍵註冊 | RegisterHotKey + WM_HOTKEY 訊息處理 | 所有 Windows 版本 |
| 熱鍵原子命名 | GlobalAddAtom/GlobalFindAtom 防止重複註冊 | 所有 Windows 版本 |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
btnHide: TButton;
btnExit: TButton;
procedure FormCreate(Sender: TObject);
procedure btnHideClick(Sender: TObject);
procedure btnExitClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
FHotKeyID: Integer;
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
RSP_SIMPLE_SERVICE = 1;
// 熱鍵:Ctrl + Alt + R
MOD_CONTROL = $0002;
MOD_ALT = $0001;
VK_R = $52; // 82
function RegisterServiceProcess(dwProcessId, dwType: DWORD): DWORD; stdcall;
external 'kernel32.dll' name 'RegisterServiceProcess';
procedure TForm1.FormCreate(Sender: TObject);
begin
// 防止多重啟動:檢查全域原子是否存在
if GlobalFindAtom('MyMonitorHotKey') = 0 then begin
FHotKeyID := GlobalAddAtom('MyMonitorHotKey');
// 註冊全域熱鍵 Ctrl+Alt+R
if not RegisterHotKey(Handle, FHotKeyID, MOD_CONTROL + MOD_ALT, VK_R) then
ShowMessage('熱鍵註冊失敗,可能已被其他程式佔用');
end
else
Halt; // 已有實例運行,直接退出
end;
{ 捕捉熱鍵訊息 }
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
if Msg.HotKey = FHotKeyID then begin
ShowMessage('偵測到熱鍵 Ctrl+Alt+R!喚醒監控介面。');
Visible := True; // 顯示隱藏的表單
WindowState := wsNormal;
SetForegroundWindow(Handle);
end;
end;
{ 隱藏進程並最小化至背景 }
procedure TForm1.btnHideClick(Sender: TObject);
begin
// 將目前進程註冊為服務進程 (Win9x 隱藏任務列表)
RegisterServiceProcess(GetCurrentProcessId, RSP_SIMPLE_SERVICE);
Hide; // 隱藏視窗
end;
procedure TForm1.btnExitClick(Sender: TObject);
begin
Close; // 觸發 FormClose 清理
end;
{ 釋放熱鍵與原子 }
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnregisterHotKey(Handle, FHotKeyID);
GlobalDeleteAtom(FHotKeyID);
end;
end.
GlobalFindAtom 檢查命名原子,存在即退出,防止多開。Ctrl+Alt+R 避開常見快捷鍵衝突;MOD_CONTROL+MOD_ALT 組合值為 3。RegisterServiceProcess 僅在 9x 核心有效 (kernel32.dll 導出),NT 核心 (2000/XP+) 已移除此函數。FormClose 中必須 UnregisterHotKey + GlobalDeleteAtom,否則系統熱鍵資源洩漏,導致後續啟動失敗。
// 1. File -> New -> Other -> Service Application
// 2. 服務資料模組 TServiceModule
// 3. OnExecute 事件中建立執行緒執行監控邏輯
// 4. 熱鍵喚醒改為:命名管道/TCP/共享記憶體與 GUI 控制端通訊
// 5. 安裝:ProjectName.exe /INSTALL
// 6. 啟動:net start ServiceName 或服務管理器
服務應用程式無視窗、開機自動啟動、Session 0 隔離、標準 SCM 管理,是生產級後台監控的正規架構。
RegisterServiceProcess)。後台監控軟體的核心在於「隱而不亡、呼之即現」。Win9x 時代的 RegisterServiceProcess 雖簡便,但現代 Windows 必須採用服務架構。全域熱鍵 RegisterHotKey 配合原子命名防重複,提供輕量級喚醒通道。掌握兩代架構差異,依目標平台選擇正確實作,即能開發專業級隱蔽監控軟體。