掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
フックしたキーコードをAppで受け取るには? (ID:26256)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>見ていただけないでしょうか? やれっ!! ということですね。 https://www.petitmonte.com/bbs/answers?question_id=4760 にあるように、 >この様な問題が発生した場合は,単純なコードで確認するのが定石です. >つまり,問題の切り分けが必要です. >ただ,この場合,必ず「新規作成」のプロジェクトで実験するのが常道です. ということで、RITSU さんのコードをコピペして実行しました。 「9 キーはフックされています」 と表示されました。 実行確認環境(これも示すのが常識ですね)は先に紹介したサンプルプログラム と同じです。 >以下、それらの箇所の抜粋です。 私は神様ではないので、RITSU さんがこの他にどんなコードを同時に実行して いるかはわかりませんので、これ以上のアドバイスはできません。 抜粋しなければないない程のコード(長さ)ではないと思いますけどね。 ----------------- DLLのコード ------------------------------------------- //==================================================================== // キーフック用DLLの雛型 //==================================================================== library TabKeyHook; uses Windows,Messages; var hHookCallWndProc:integer; //好みの命名ではないけど... MainFormHandle: THandle; //==================================================================== // フックのコールバック関数 // このDLLを使用したアプリにキーコードを送る. // メッセージIDはWM_APP+100固定としているが,StartKeyHookの引数で外 // 部で決めてもよい. //==================================================================== function KeyWndProc(nCode:integer;wParam:integer;lParam:integer): integer; stdcall; begin if nCode < 0 then begin Result := CallNextHookEx(hHookCallWndProc, nCode, wParam, lParam); end else begin; Result := CallNextHookEx(hHookCallWndProc, nCode, wParam, lParam); if nCode=HC_ACTION then begin case Wparam of VK_TAB: begin Result:=-1; PostMessage(MainFormHandle,WM_APP+100,Wparam,0); //★キーコードを送信★ end; end; end; end; end; //==================================================================== // フック関数の登録 // 登録するフック関数はKeyBoardProc // 内部または外部とのやり取りに必要なら引数を追加して使用する //==================================================================== function InstallCallWndProcHook(AppHandle:THandle): Boolean; stdcall; var Ret:Integer; begin Result:=False; Ret:=SetWindowsHookEx(WH_KEYBOARD,@KeyWndProc,HInstance,0); if Ret=0 then Exit else hHookCallWndProc:=ret; Result:=True; MainFormHandle := AppHandle; //★Form1のハンドルを受け取る★ end; //==================================================================== // フックの解除 //==================================================================== procedure StopKeyHook; stdcall; begin UnhookWindowsHookEx(hHookCallWndProc); end; //==================================================================== // 外部からDLL内のメソッドを利用可能にするためのオマジナイ //==================================================================== exports InstallCallWndProcHook, StopKeyHook; begin end. ------------------- DLLを使用するプログラム --------------------------- function InstallCallWndProcHook(Wnd: HWND): Boolean; stdcall; external 'TabKeyHook.dll'; procedure StopKeyHook; stdcall; external 'TabKeyHook.dll'; var hHookLib : THANDLE; HookFlag : Boolean; //============================================================================= // 本Fomr破棄の時にはフックを解除 //============================================================================= procedure TForm1.FormDestroy(Sender: TObject); begin StopKeyHook; FreeLibrary(hHookLib); end; //============================================================================= // Application側でメッセージ通知を受取る // ここではフォームのWndProcメソッドを使用 //============================================================================= procedure TForm1.WndProc(var msg: TMessage); begin if (msg.Msg=WM_APP+100) then begin showmessage(inttostr(msg.wParam) +' キーはフックされています'); end; inherited WndProc(msg); end; //============================================================================= // キーフックを有効にする //============================================================================= procedure TForm1.Button1Click(Sender: TObject); begin HookFlag :=False; try if hHookLib=0 then hHookLib := LoadLibrary('TabKeyHook.dll'); InstallCallWndProcHook(Form1.Handle); except end; end; //============================================================================= // キーフックを無効にする //============================================================================= procedure TForm1.Button2Click(Sender: TObject); begin StopKeyHook; end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.