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

Delphi 全域熱鍵隱藏/顯示當前作用中視窗 (鍵盤鉤子 WH_KEYBOARD)

     編輯:Delphi

需求

按下全域熱鍵 (Ctrl+Alt+F12) 隱藏目前前景視窗 (不顯示在工作列),再按一次還原。需在 DLL 中設置系統鉤子 (WH_KEYBOARD) 攔截全域鍵盤訊息。

架構

  • HKHide.pas:鉤子 DLL 核心,導出 EnableHideHook/DisableHideHook。
  • HKPHide.dpr:DLL 專案,初始化/終結時自動掛載/卸載鉤子。
  • Unit1.pas:測試 EXE,載入 DLL 並呼叫啟用/停用。

核心鉤子程式碼 (HKHide.pas 節錄)


function KeyboardHookHandler(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
const KeyPressMask = $80000000;
var F: TextFile; S: String; H: Longint;
begin
  Result := 0;
  if iCode < 0 then begin Result := CallNextHookEx(hNextHookHide, iCode, wParam, lParam); Exit; end;

  // 偵測 Ctrl+Alt+F12 按下 (lParam 最高位=0 表示按下)
  if (lParam and KeyPressMask = 0) and (GetKeyState(VK_CONTROL) < 0) and (GetKeyState(VK_MENU) < 0) and (wParam = VK_F12) then
  begin
    Result := 1;  // 攔截訊息不再傳遞
    if not FileExists('C:\test.txt') then
    begin
      AssignFile(F, 'C:\test.txt'); Rewrite(F); WriteLn(F, 0); CloseFile(F);
    end
    else
    begin
      AssignFile(F, 'C:\test.txt'); Reset(F); ReadLn(F, S); H := StrToInt(S);
      if H = 0 then
      begin
        H := GetActiveWindow;  // 取得目前前景視窗
        WriteLn(F, IntToStr(H)); ShowWindow(H, SW_HIDE);
      end
      else
      begin
        ShowWindow(H, SW_SHOW); WriteLn(F, '0');
      end;
      CloseFile(F);
    end;
  end
  else
    Result := CallNextHookEx(hNextHookHide, iCode, wParam, lParam);
end;

function EnableHideHook: BOOL;
begin
  if hNextHookHide <> 0 then Exit(False);
  hNextHookHide := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookHandler, HInstance, 0);
  Result := hNextHookHide <> 0;
end;

function DisableHideHook: BOOL;
begin
  if hNextHookHide <> 0 then
  begin
    UnhookWindowsHookEx(hNextHookHide); hNextHookHide := 0; Result := True;
  end else Result := False;
end;

測試程式 (Unit1.pas)


function EnableHideHook: BOOL; external 'HKPHide.dll';
function DisableHideHook: BOOL; external 'HKPHide.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin if EnableHideHook then ShowMessage('熱鍵已啟用:Ctrl+Alt+F12 隱藏/顯示前景視窗'); end;

procedure TForm1.Button2Click(Sender: TObject);
begin if DisableHideHook then ShowMessage('熱鍵已停用'); end;

注意事項

  • DLL 必須與 EXE 位於同目錄或系統路徑。
  • 使用檔案 C:\test.txt 儲存視窗句柄,僅供示範;正式專案建議用共享記憶體 (CreateFileMapping) 或全域原子表。
  • Vista/UAC 環境下全域鉤子需簽名或降低完整性等級,建議改用 RegisterHotKey (僅限特定視窗) 或低階鍵盤過濾驅動。
  • Delphi 4/5/6/7 32-bit 編譯通過。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved