2012년 11월 13일 화요일

<펌> SetWindowsHookEx 이용 Keyboard Hook


unit UKeyHookMain;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  end;
var
  Form1: TForm1;
  HookID: HHOOK;
procedure KeybdHook;
procedure KeybdUnhook;

implementation
{$R *.dfm}
type
  PKeyHookStruct = ^TKeyHookStruct;
  TKeyHookStruct = record
    vkCode: Integer;
    ScanCode: Integer;
    Flags: Integer;
    Time: Integer;
    dwExtraInfo: Integer;
  end;
  // 키 입력 필터링 함수

function LLKeyHookFunc(HookCode: Integer; KeyCode: wParam; kStrokeInfo: lParam): LResult; stdcall;
var
  PKeyHook: PKeyHookStruct;
  idlestate: boolean;
begin
  // 키 정보 받아오기
  PKeyHook := Ptr(kStrokeInfo);
  if HookCode >= 0 then begin
    // SHIFT + F2
    // Showmessage(Format('%d',[GetAsyncKeyState(VK_SHIFT)]));
    if (PKeyHook.vkCode = VK_F2) and (GetAsyncKeyState(VK_SHIFT) < -32766) then begin
      // 항상 맨 위에
      Form1.FormStyle := fsStayOnTop;
      Result := 1;
    end
    // SHIFT + F3
    else if (PKeyHook.vkCode = VK_F3) and (GetAsyncKeyState(VK_SHIFT) < -32766) then begin
      // 항상 맨 위에 아님..
      Form1.FormStyle := fsNormal;
      Result := 1;
    end;
    idleState := true;
  end;
  // 필터링 된 키가 아니라면 계속 진행
  Result := CallNextHookEx(HookID, HookCode, KeyCode, kStrokeInfo);
end;

procedure KeybdHook;
const
  WH_KEYBOARD_LL = 13;
begin
  HookID := SetWindowsHookEx(WH_KEYBOARD_LL, @LLKeyHookFunc, hInstance, 0);
end;

procedure KeybdUnhook;
begin
  UnHookWindowsHookEx(HookID);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  KeybdUnHook;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  KeybdHook;
end;

end.

댓글 없음:

델파이 12.1이냐 11.3이냐?

 델파이가 12.1이 나왔습니다. 혹시 11.3버전의 커뮤니티버전이 필요하시는분이 있을 수 있을 것 같아 https://altd.embarcadero.com/.../RADStudio_11_3_esd_28... 와 이것 찾느랴 엄청고생함.