#define STRLBUTTON TEXT("マウス左ボタンが押されました from mainProc")
#define STRRBUTTON TEXT("マウス右ボタンが押されました from my_HookProc")
#define STRCOMMAND TEXT("ボタンが押されました")
HWND hButton1;
LRESULT CALLBACK my_HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPRETSTRUCT *pcwpRetStruct = (CWPRETSTRUCT *)lParam;
HDC hDC;
if(nCode==HC_ACTION)
{
hDC = GetDC(pcwpRetStruct->hwnd);
switch(pcwpRetStruct->message)
{
case WM_COMMAND:
TextOut(hDC, 10, 10, STRCOMMAND, strlen(STRCOMMAND));
break;
case WM_RBUTTONDOWN:
TextOut(hDC, 10, 10, STRRBUTTON, strlen(STRRBUTTON));
break;
}
ReleaseDC(pcwpRetStruct->hwnd, hDC);
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
LRESULT CALLBACK mainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HHOOK hHook;
HDC hDC;
switch(uMsg)
{
case WM_DESTROY:
UnhookWindowsHookEx(hHook);
PostQuitMessage(0);
return 0;
case WM_CREATE:
hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, my_HookProc, NULL, GetCurrentThreadId() );
if(!hHook)
MessageBox(NULL, "hooking failed", NULL, MB_OK);
hButton1 = CreateWindow(
"BUTTON", "hButton1",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
10, 40, 100, 20,
hWnd, NULL,
((LPCREATESTRUCT)lParam)->hInstance, NULL
);
return 0;
case WM_LBUTTONDOWN:
hDC = GetDC(hWnd);
TextOut(hDC, 10, 10, STRLBUTTON, strlen(STRLBUTTON));
ReleaseDC(hWnd, hDC);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
No.1ベストアンサー
- 回答日時:
WH_CALLWNDPROCRETはSendMessageで送られたメッセージのみを対象とし、WM_xBUTTONDOWNはPostMessageで送られるからです。
WH_GETMESSAGEならばWM_xBUTTONDOWNをフックすることができます。そういうことだったんですか。
WH_CALLWNDPROCRETは、普通にどんなメッセージでもフックできるものだと思っていました。
だからWM_xBUTTONDOWNも当然サポートしているものだと・・。
CallWndRetProcのnCodeの値がHC_ACTIONかそうでないかに関係なくWM_xBUTTONDOWNを処理しようとすると、できてしまったので、ただ単に、フックプロシージャの働きの違いは、nCodeがメッセージを対象とするか否かの違いでしかないようですね。
(と、いまのところ思っている)
答えてもらえないんじゃないかと思っていましたが、お答えいただきありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Win32APIでウィンドウを中央に...
-
LoadImageを使用し、タイトルバ...
-
ウィンドウハンドルがメッセー...
-
WinAPIでの画像高速切り替え表...
-
DirectInputについて再
-
MessageBoxについて
-
2÷3などの余りについて
-
Enterキーを押されたら次の処理...
-
「指定されたキャストは有効で...
-
マイナスからプラスへ転じた時...
-
二次関数と関数の違いは何ですか?
-
「Aに対するBの割合」と「Aに対...
-
C言語初心者です、、、お助けく...
-
数字以外が入力されたらエラー...
-
2番以降って2番も含まれますか...
-
プログラムでの数字につく”f”の...
-
java初心者です。入力されたの...
-
DWORDの実際の型は何でしょうか
-
「{ } で囲むだけ」は正しい?
-
空ENTERの判別
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダイアログプログラムでEnterキ...
-
エディットボックスの背景の色...
-
Win32APIでウィンドウを中央に...
-
オーバーレイみたいな処理がしたい
-
C言語win32api、エディットボッ...
-
C#のswitch文を簡略化したいの...
-
LoadImageを使用し、タイトルバ...
-
コンソールアプリケーションの...
-
COMPORTマルチスレッドで例外発生
-
ウィンドウ非表示に時に表示し...
-
エラー Run-Time Check Failur...
-
ポップアップメニュー
-
Win32のファイルダイアログのサ...
-
キャレットの現在位置の表示 (W...
-
不明なエラー
-
ボタンの色(WINAPI)
-
Win32APIにて、ウィンドウ全体...
-
ゲームとかの解像度変更&全画...
-
エディットコントロール入力時...
-
MoveToExとLineToについて
おすすめ情報