1つのアプリの中で、メインプロージャとフックプロージャを作りました。
フックはキーボードフックです。
HHOOK hHook;
LRESULT CALLBACK MyHookProc(int nCode, WPARAM wParam, LPARAM lParam){
if(nCode < 0)return CallNextHookEx(hHook, nCode, wParam, lParam);
if(wParam == 0x31)return FALSE;
return TRUE;
}
フックしていても 「ぬ」 のキーは使えるようにしました。
if(wParam == 0x31)return FALSE;
は
if(wParam == 0x31)return CallNextHookEx(hHook, nCode, wParam, lParam);
にしても違いが分かりませんでした。
return FALSE では、メッセージをキューから削除らしいけど、メインの
プロージャで
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
switch(msg){
case WM_KEYDOWN:
if(wParam == 0x31)MessageBox(hWnd, "メインプロージャから", "", MB_OK);
break;
にしても、フックプロージヤの戻り値は CallNextHookEx( ) でも FALSE
でも MessageBox() は表示されました。
CallNextHookEx( ) にした場合と FALSE にした場合、何が違うのか、
どういうソースなら違いを確かめられるのか教えてください。
No.2ベストアンサー
- 回答日時:
>「ぬ」をフックしているアプリが
>1つしかない場合とか、次の段のフックプロシージャが
>存在しない場合は、「ぬ」に対しての処理で、
>return FALSE と return CallNextHookEx( ) は全く同じ
>というように感じました。 本当にそうなんですか?
「本当にそうなんですか?」って言われるとツライです。試したわけではないので。
ただ他にフックがかかっているかどうか調べる方法はないので
(知らないだけかもしれませんが)、
「処理をとめたい」場合以外はCallNextHookExしておくのが無難かと。
ありがとうございます。
return TRUE なら処理が止まるけど、止めたくないなら
CallNextHookEx( ) とすれば無難ですよね。
まだ2つ以上のフックを使ったことがないんだけど
return FALSE では次のフックは動作せず、
CallNextHookEx なら次のフックが動作すると想像できたから
今はこれ以上考えないことにしました。
No.1
- 回答日時:
えと、自信あんましありませんが…
フックって理論上は何段でもかけられるんじゃないですか?
だから、あるフックが、次のフックに制御を渡すのが
CallNextHookなわけで、そのままreturnすれば
それ以降のフックの処理は行われない、ということだと思います。
示されている例の戻り値が一緒だったってのは
最後のフックはFALSEを返すことが決まっている、
とかなんじゃないかと。
だから自分でFALSEを返せばそこで処理はとまってFALSE、
CallNextHookなら最後のフックでFALSEが返ってFALSE、
ということなんでは?
疑問形ばっかの回答ですいません。
この回答への補足
ありがとうございます。
フックは何段でも仕掛けられるみたいですね。
CallNextHook( ) っていう関数があるし。
AAA.EXE も BBB.EXE も「ぬ」をフックしている場合、
最初に「ぬ」が AAA.EXE に通知されて、それを
return FALSE にすると、BBB.EXE には通知が
行かないみたいだけど、「ぬ」をフックしているアプリが
1つしかない場合とか、次の段のフックプロージャが
存在しない場合は、「ぬ」に対しての処理で、
return FALSE と return CallNextHookEx( ) は全く同じ
というように感じました。
本当にそうなんですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 追加ボタンを押した際に ok ボタンを押した場合のみ入力値が追記されるようにしたいです 6 2022/05/29 09:57
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エディットボックスの背景の色...
-
この列挙体でsysjanの関数はあ...
-
画像を表示したいのですが……
-
不明なエラー
-
エラー Run-Time Check Failur...
-
COMPORTマルチスレッドで例外発生
-
子ウインドウの作成と破棄について
-
エディットコントロール入力時...
-
音量調節
-
WM_CREATE について
-
プログラミングでエラーが出ま...
-
Enterキーを押されたら次の処理...
-
fgetsなどのときのstdinのバッ...
-
マイナスからプラスへ転じた時...
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
「an=(n-1)/(n+1)のときlim[n→∞...
-
c言語で、繰り返し文の中で、0....
-
C言語での引数の省略方法
-
正負を反転させて出力するプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Win32APIでウィンドウを中央に...
-
オーバーレイみたいな処理がしたい
-
ダイアログプログラムでEnterキ...
-
キャレットの現在位置の表示 (W...
-
PeekMessageについて
-
ウィンドウ非表示に時に表示し...
-
C#のswitch文を簡略化したいの...
-
C言語win32api、エディットボッ...
-
音量調節
-
LoadImageを使用し、タイトルバ...
-
プログラミングでエラーが出ま...
-
エディットコントロール入力時...
-
ウィンドウハンドルがメッセー...
-
ボタンの色(WINAPI)
-
画像を表示したいのですが……
-
WINAPIでキーから文字列を入力...
-
エラー Run-Time Check Failur...
-
エディットボックスの背景の色...
-
Win32APIでアイコンファイルを...
-
WM_KEYDOWNでPrtScを捕まえる方...
おすすめ情報