{*******************************************************} { } { CatchKeyDLL } { } { Copyright (C) 2022 sunk } { } {*******************************************************} unit KeyMonDLL; interface uses System.Classes, System.SysUtils, Winapi.Windows, Tocsg.Obj, Winapi.Messages, Tocsg.CommonData, Define, DefineKeyMon; {$IFDEF _HE_} {$DEFINE BLOCK_KEY} {$ENDIF} const WM_CATCHKEY_NOTIFY = WM_USER + 3948; WM_CATCHMOUSE_NOTIFY = WM_CATCHKEY_NOTIFY + 1; type THookState = (hsFree, hsHooking, hsReload, hsFinish); PSharedData = ^TSharedData; TSharedData = packed record hRcvWnd: ULONGLONG; // 8 바이트 고정 dwLastInputTick: DWORD; HookState: THookState; {$IFDEF BLOCK_KEY} DisESC, DisWin, DisAlt, DisCtrl: Boolean; DisEtcs: array [0..30] of Byte; {$ENDIF} end; TInstallCatchKeyHook = function: Integer; stdcall; TUninstallCatchKeyHook = function: Integer; stdcall; TKeyMonDLL = class(TTgObject) private hDll_: THandle; SharedData_: TTgFileMapping; fnInstallCatchKeyHook_: TInstallCatchKeyHook; fnUnInstallCatchKeyHook_: TUninstallCatchKeyHook; public Constructor Create(hRcvWnd: HWND; const sShareMapFilename, sDllPath: String); Destructor Destroy; override; function InstallCatchKeyHook: Integer; function UnInstallCatchKeyHook: Integer; {$IFDEF BLOCK_KEY} procedure SetDisableKey_ESC(const bVal: Boolean); procedure SetDisableKey_Win(const bVal: Boolean); procedure SetDisableKey_Alt(const bVal: Boolean); procedure SetDisableKey_Ctrl(const bVal: Boolean); procedure SetDisableKey_Etc(nIdx: Integer; ucKey: Byte); {$ENDIF} end; implementation uses Tocsg.WinInfo, Tocsg.Path, Tocsg.Shell; { TKeyMonDLL } Constructor TKeyMonDLL.Create(hRcvWnd: HWND; const sShareMapFilename, sDllPath: String); var sPath: String; begin SharedData_ := TTgFileMapping.Create(sShareMapFilename, SizeOf(TSharedData)); ASSERT(SharedData_.IsAvailable); ZeroMemory(SharedData_.Data, SizeOf(TSharedData)); SharedData_.Data.hRcvWnd := hRcvWnd; SharedData_.Data.dwLastInputTick := 0; SharedData_.Data.HookState := hsFree; {$IFDEF BLOCK_KEY} SharedData_.Data.DisESC := false; SharedData_.Data.DisWin := false; SharedData_.Data.DisAlt := false; SharedData_.Data.DisCtrl := false; {$ENDIF} // _Trace('Wnd = %d', [hRcvWnd]); Inherited Create; hDll_ := LoadLibrary(PChar(sDllPath)); if hDll_ = 0 then begin _Trace('Fail .. LoadLibrary(), Path="%s"', [sDllPath]); exit; end; @fnInstallCatchKeyHook_ := GetProcAddress(hDll_, 'InstallCatchKeyHook'); @fnUnInstallCatchKeyHook_ := GetProcAddress(hDll_, 'UnInstallCatchKeyHook'); ChangeWindowMessageFilter(WM_CATCHKEY_NOTIFY, MSGFLT_ADD); nLastError_ := InstallCatchKeyHook; end; Destructor TKeyMonDLL.Destroy; begin if hDll_ <> 0 then begin UnInstallCatchKeyHook; FreeLibrary(hDll_); end; Inherited; FreeAndNil(SharedData_); end; function TKeyMonDLL.InstallCatchKeyHook: Integer; begin Result := -1; if Assigned(fnInstallCatchKeyHook_) then Result := fnInstallCatchKeyHook_; end; function TKeyMonDLL.UnInstallCatchKeyHook: Integer; begin Result := -1; if Assigned(fnUnInstallCatchKeyHook_) then Result := fnUnInstallCatchKeyHook_; end; {$IFDEF BLOCK_KEY} procedure TKeyMonDLL.SetDisableKey_ESC(const bVal: Boolean); begin SharedData_.Data.DisESC := bVal; end; procedure TKeyMonDLL.SetDisableKey_Win(const bVal: Boolean); begin SharedData_.Data.DisWin := bVal; end; procedure TKeyMonDLL.SetDisableKey_Alt(const bVal: Boolean); begin SharedData_.Data.DisAlt := bVal; end; procedure TKeyMonDLL.SetDisableKey_Ctrl(const bVal: Boolean); begin SharedData_.Data.DisCtrl := bVal; end; procedure TKeyMonDLL.SetDisableKey_Etc(nIdx: Integer; ucKey: Byte); begin if (nIdx < 0) or (nIdx > 30) then exit; SharedData_.Data.DisEtcs[nIdx] := ucKey; end; {$ENDIF} end.