天使と悪魔選手権

#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);
}

A 回答 (1件)

WH_CALLWNDPROCRETはSendMessageで送られたメッセージのみを対象とし、WM_xBUTTONDOWNはPostMessageで送られるからです。

WH_GETMESSAGEならばWM_xBUTTONDOWNをフックすることができます。
    • good
    • 0
この回答へのお礼

そういうことだったんですか。
WH_CALLWNDPROCRETは、普通にどんなメッセージでもフックできるものだと思っていました。
だからWM_xBUTTONDOWNも当然サポートしているものだと・・。

CallWndRetProcのnCodeの値がHC_ACTIONかそうでないかに関係なくWM_xBUTTONDOWNを処理しようとすると、できてしまったので、ただ単に、フックプロシージャの働きの違いは、nCodeがメッセージを対象とするか否かの違いでしかないようですね。
(と、いまのところ思っている)

答えてもらえないんじゃないかと思っていましたが、お答えいただきありがとうございます。

お礼日時:2005/11/13 10:54

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


おすすめ情報