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

WinAPI 鉤子回調:ForegroundIdleProc 詳細解析

     編輯:Delphi

ForegroundIdleProc 回調函數

ForegroundIdleProc 配合 WH_FOREGROUNDIDLE 鉤子類型,在前台線程訊息佇列空閒時被系統周期性呼叫。類似 WM_ENTERIDLE 但更底層,可用於背景低優先級任務、自動儲存、垃圾回收等。

函數原型

function ForegroundIdleProc(
  nCode: Integer;    // 鉤子代碼
  wParam: WPARAM;    // 保留,通常 0
  lParam: LPARAM     // 保留,通常 0
): LRESULT; stdcall;

參數與觸發條件

  • nCode:HC_ACTION (0) 表示前台線程進入閒置狀態,可執行任務;負值傳遞給 CallNextHookEx。
  • 觸發時機:當前台線程完成所有訊息處理,GetMessage/PeekMessage 即將等待新訊息前。
  • 頻率:非固定間隔,取決於使用者輸入頻率;高負載時幾乎不觸發。

典型用途

  • 自動儲存草稿 (定期檢查髒標記)
  • 背景索引/檢索更新
  • 記憶體整理、快取清理
  • 長時間無操作自動鎖定/登出

系統級 vs 線程級部署

屬性系統級 (dwThreadId=0)線程級 (dwThreadId=目標線程)
回調位置DLLEXE 可行
監控範圍所有前台線程單一線程
適用場景系統級工具 (螢幕保護、備份代理)應用內部閒置任務

關鍵限制與替代方案

  • 不可靠的觸發頻率:使用者持續移動滑鼠即不觸發,不適合硬性定時任務。
  • 效能影響:系統級鉤子會增加每次訊息迴路空閒檢查開銷。
  • 現代替代:
    • SetTimer / WM_TIMER:固定間隔,可靠
    • Application.OnIdle (VCL) / TIdleTimer:框架級閒置處理
    • WaitableTimer + 背景線程:精確、不阻塞 UI
    • Windows 任務排程器:系統級定時任務

簡易範例:應用內部閒置自動儲存 (線程級,EXE 實現)

unit IdleHookUnit;
interface
uses Windows, Classes;
var hIdleHook: HHOOK = 0;
    IdleCounter: Integer = 0;

function ForegroundIdleProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  if nCode = HC_ACTION then
  begin
    Inc(IdleCounter);
    if IdleCounter >= 100 then  // 約 100 次空閒週期
    begin
      IdleCounter := 0;
      // 執行自動儲存等低優先級任務
      // 注意:此處不可做耗時操作,建議 PostMessage 通知主線程
    end;
  end;
  Result := CallNextHookEx(hIdleHook, nCode, wParam, lParam);
end;

procedure InstallIdleHook(ThreadId: DWORD);
begin
  if hIdleHook = 0 then
    hIdleHook := SetWindowsHookEx(WH_FOREGROUNDIDLE, @ForegroundIdleProc, HInstance, ThreadId);
end;

procedure UninstallIdleHook;
begin
  if hIdleHook <> 0 then
  begin
    UnhookWindowsHookEx(hIdleHook);
    hIdleHook := 0;
  end;
end;
implementation
end.

總結

WH_FOREGROUNDIDLE 是較冷門的鉤子類型,現代開發極少直接使用。理解其存在有助於維護舊代碼,新專案請優先選用 Timer、OnIdle、背景線程等更可控的方案。

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