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

Delphi 開發後台監控軟體:隱藏進程、全域熱鍵喚醒完整實作

     編輯:更多程式設計知識

後台監控軟體需滿足三大核心需求:任務列/管理器隱藏、系統托盤/無介面運行、全域熱鍵喚醒管理介面。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 版本

完整表單應用程式原始碼 (Win9x/2000/XP 通用)


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.

關鍵點解析

  1. 單一實例保護:GlobalFindAtom 檢查命名原子,存在即退出,防止多開。
  2. 熱鍵組合選擇:Ctrl+Alt+R 避開常見快捷鍵衝突;MOD_CONTROL+MOD_ALT 組合值為 3。
  3. Win9x vs NT 隱藏差異:
    • RegisterServiceProcess 僅在 9x 核心有效 (kernel32.dll 導出),NT 核心 (2000/XP+) 已移除此函數。
    • NT 核心**正規做法**是建立「服務應用程式」專案類型,安裝為 Windows 服務,完全無互動視窗,透過 SCM 管理。
  4. 熱鍵清理:FormClose 中必須 UnregisterHotKey + GlobalDeleteAtom,否則系統熱鍵資源洩漏,導致後續啟動失敗。

進階:NT 核心下的正規服務架構


// 1. File -> New -> Other -> Service Application
// 2. 服務資料模組 TServiceModule
// 3. OnExecute 事件中建立執行緒執行監控邏輯
// 4. 熱鍵喚醒改為:命名管道/TCP/共享記憶體與 GUI 控制端通訊
// 5. 安裝:ProjectName.exe /INSTALL
// 6. 啟動:net start ServiceName 或服務管理器

服務應用程式無視窗、開機自動啟動、Session 0 隔離、標準 SCM 管理,是生產級後台監控的正規架構。

部署建議

  • 針對 Windows 9x 使用者提供表單版本 (含 RegisterServiceProcess)。
  • 針對 Windows 2000/XP/Vista/7/10/11 提供服務版本 + 獨立 GUI 控制工具。
  • 安裝程式自動偵測 OS 版本部署對應版本。
  • 數位簽章驅動程式/服務,提升信任度並避免防毒軟體誤攔。

結語

後台監控軟體的核心在於「隱而不亡、呼之即現」。Win9x 時代的 RegisterServiceProcess 雖簡便,但現代 Windows 必須採用服務架構。全域熱鍵 RegisterHotKey 配合原子命名防重複,提供輕量級喚醒通道。掌握兩代架構差異,依目標平台選擇正確實作,即能開發專業級隱蔽監控軟體。

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