アプリ版:「スタンプのみでお礼する」機能のリリースについて

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 にした場合、何が違うのか、
どういうソースなら違いを確かめられるのか教えてください。

A 回答 (2件)

>「ぬ」をフックしているアプリが


>1つしかない場合とか、次の段のフックプロシージャが
>存在しない場合は、「ぬ」に対しての処理で、
>return FALSE と return CallNextHookEx( ) は全く同じ
>というように感じました。 本当にそうなんですか?

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

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

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

まだ2つ以上のフックを使ったことがないんだけど
return FALSE では次のフックは動作せず、
CallNextHookEx なら次のフックが動作すると想像できたから
今はこれ以上考えないことにしました。

お礼日時:2002/04/19 19:49

えと、自信あんましありませんが…



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

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

疑問形ばっかの回答ですいません。

この回答への補足

ありがとうございます。

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

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

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

というように感じました。
本当にそうなんですか?

補足日時:2002/04/07 08:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!