掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
フックしたキーコードをAppで受け取るには? (ID:26253)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
DLLを用いたグローバルフックで、特定のキーを無効にすることは出来たのですが そのキーコードを、DLLを呼び出したプログラムへ送る方法が上手くいきません。 コールバック関数を使い、DLLの方からUnit1の関数を使えるようにし、そこに キーコードを乗っけて送ってやれば良いと思ったのですが、どうも、DLLの中の キーフックをしているフィルタ関数の中にそれを書く(つまりコールバックの 二階建て)とするとそれが作動してくれないようです。 そのフィルタ関数の外に書けば、普通にそのコールバック関数は作動してくれます。 以下、プログラムの抜粋です。 (DLL側) Type TTestSound = procedure;stdcall; var TestSound:TTestSound; function CallbackSomeFunc(Addr:Pointer):boolean;stdcall; begin result := false; if Addr = NIL then exit; @TestSound := Addr; result := true; end; //Tabボタンを効かなくさせる Function KeyWndProc(nCode:Integer; wParam:WPARAM; lParam:LPARAM):LRESULT;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; TestSound; //★ここにコールバック関数を記述 end; End; End; End; End; Function InstallCallWndProcHook:Boolean; var Ret:Integer; begin Result:=False; Ret:=SetWindowsHookEx(WH_KEYBOARD,@KeyWndProc,HInstance,0); if Ret=0 then Exit else hHookCallWndProc:=ret; Result:=True; end; (App側) //音を鳴らすだけのコールバック関数 procedure TSound;stdcall; begin beep; end; //DLLへ登録 procedure TForm1.Button1Click(Sender: TObject); var hDLL: THandle; CallbackSomeFunc:function(Addr:Pointer):boolean;stdcall; begin hDLL := LoadLibrary('KeyHook.dll'); if hDLL <> 0 then begin @CallbackSomeFunc := GetProcAddress(hDLL,'CallbackSomeFunc'); if @CallbackSomeFunc <> nil then begin CallbackSomeFunc(@TSound); end else begin showmessage('コールバック関数の登録に失敗しました'); end; FreeLibrary(hDLL); end else begin showmessage('DLLがありません'); end; end; このように記述すると、★の行がなければちゃんとTabが効かなくなるのですが、 ★を追加することでbeepも鳴らなければTabまでフックされずにスルーされるように なってしまうようです。 まだHookは勉強したてで、色々調べたのですがここで詰まってしまいました。 どなたかご存知の方、ご教授のほどお願い致します。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.