• 締切済み

CallNextHookEx( ) == FALSE

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しておくのが無難かと。

A__
質問者

お礼

ありがとうございます。 return TRUE なら処理が止まるけど、止めたくないなら CallNextHookEx( ) とすれば無難ですよね。 まだ2つ以上のフックを使ったことがないんだけど return FALSE では次のフックは動作せず、 CallNextHookEx なら次のフックが動作すると想像できたから 今はこれ以上考えないことにしました。

回答No.1

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

A__
質問者

補足

ありがとうございます。 フックは何段でも仕掛けられるみたいですね。 CallNextHook( ) っていう関数があるし。 AAA.EXE も BBB.EXE も「ぬ」をフックしている場合、 最初に「ぬ」が AAA.EXE に通知されて、それを return FALSE にすると、BBB.EXE には通知が 行かないみたいだけど、「ぬ」をフックしているアプリが 1つしかない場合とか、次の段のフックプロージャが 存在しない場合は、「ぬ」に対しての処理で、 return FALSE と return CallNextHookEx( ) は全く同じ というように感じました。 本当にそうなんですか?

関連するQ&A