OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
締切り
済み

CallNextHookEx( ) == FALSE

  • 暇なときにでも
  • 質問No.245945
  • 閲覧数342
  • ありがとう数1
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 59% (194/328)

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 にした場合、何が違うのか、
どういうソースなら違いを確かめられるのか教えてください。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全2件)

  • 回答No.1
レベル8

ベストアンサー率 39% (23/58)

えと、自信あんましありませんが… フックって理論上は何段でもかけられるんじゃないですか? だから、あるフックが、次のフックに制御を渡すのが CallNextHookなわけで、そのままreturnすれば それ以降のフックの処理は行われない、ということだと思います。 示されている例の戻り値が一緒だったってのは 最後のフックはFALSEを返すことが決まっている、 とかなんじゃないかと。 ...続きを読む
えと、自信あんましありませんが…

フックって理論上は何段でもかけられるんじゃないですか?
だから、あるフックが、次のフックに制御を渡すのが
CallNextHookなわけで、そのままreturnすれば
それ以降のフックの処理は行われない、ということだと思います。

示されている例の戻り値が一緒だったってのは
最後のフックはFALSEを返すことが決まっている、
とかなんじゃないかと。
だから自分でFALSEを返せばそこで処理はとまってFALSE、
CallNextHookなら最後のフックでFALSEが返ってFALSE、
ということなんでは?

疑問形ばっかの回答ですいません。
補足コメント
A__

お礼率 59% (194/328)

ありがとうございます。

フックは何段でも仕掛けられるみたいですね。
CallNextHook( ) っていう関数があるし。

AAA.EXE も BBB.EXE も「ぬ」をフックしている場合、
最初に「ぬ」が AAA.EXE に通知されて、それを
return FALSE にすると、BBB.EXE には通知が
行かないみたいだけど、「ぬ」をフックしているアプリが
1つしかない場合とか、次の段のフックプロージャが
存在しない場合は、「ぬ」に対しての処理で、

return FALSE と return CallNextHookEx( ) は全く同じ

というように感じました。
本当にそうなんですか?
投稿日時 - 2002-04-07 08:30:46
  • 回答No.2
レベル8

ベストアンサー率 39% (23/58)

>「ぬ」をフックしているアプリが >1つしかない場合とか、次の段のフックプロシージャが >存在しない場合は、「ぬ」に対しての処理で、 >return FALSE と return CallNextHookEx( ) は全く同じ >というように感じました。 本当にそうなんですか? 「本当にそうなんですか?」って言われるとツライです。試したわけではないので。 ...続きを読む
>「ぬ」をフックしているアプリが
>1つしかない場合とか、次の段のフックプロシージャが
>存在しない場合は、「ぬ」に対しての処理で、
>return FALSE と return CallNextHookEx( ) は全く同じ
>というように感じました。 本当にそうなんですか?

「本当にそうなんですか?」って言われるとツライです。試したわけではないので。

ただ他にフックがかかっているかどうか調べる方法はないので
(知らないだけかもしれませんが)、
「処理をとめたい」場合以外はCallNextHookExしておくのが無難かと。
お礼コメント
A__

お礼率 59% (194/328)

ありがとうございます。
return TRUE なら処理が止まるけど、止めたくないなら
CallNextHookEx( ) とすれば無難ですよね。

まだ2つ以上のフックを使ったことがないんだけど
return FALSE では次のフックは動作せず、
CallNextHookEx なら次のフックが動作すると想像できたから
今はこれ以上考えないことにしました。
投稿日時 - 2002-04-19 19:49:40
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ