Last Updated 2004/10/06
Visual C++ MFC マウス
マウスのフック
2004/10/06

1日に何回マウスをクリックしたかなどを計測するにはマウスのフックを行う.
フックは SetWindowsHookEx() を使用する.
(システムフックとなるので DLL に作成しなければならない)
(フックプロシージャが DLL にないといけない)
グローバルな変数は初期化済にして共有セクションに配置しなければならない.

プロジェクトの設定は,リンカのコマンド行に "/section:shared, RWS" を追加する.

ヘッダーファイル
#ifdef __cplusplus
extern "C" {
#endif
HHOOK APIENTRY SetHook(HWND hWnd);
void  APIENTRY UnSetHook();
#ifdef __cplusplus
}
#endif


ソースファイル
#include 
#include "ヘッダーファイル"

#pragma data_seg("shared")
  HINSTANCE hInst = 0;
  HHOOK hHook = 0;
  HWND  hAppWnd=0;
#pragma data_seg()

BOOL WINAPI DllMain(HINSTANCE hInstance,
                    ULONG ul_reason_for_call,
                    LPVOID lpReserved)
{
    switch(ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
        hInst = hInstance;
        hHook = 0;
        break;

    case DLL_THREAD_ATTACH:
        break;

    case DLL_THREAD_DETACH:
        break;

    case DLL_PROCESS_DETACH:
        break

    default:
        break;
    }

    return TRUE;
}


LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode < 0) {
        return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
    switch(wParam) {
    case WM_LBUTTONUP:
    case WM_RBUTTONUP:
        PostMessage(hAppWnd, WM_USER + 100, 0, 0);
    }
    return 0;
}


HHOOK APIENTRY SetHook(HWND hWnd)
{
    if (hHook) return hHook;

    hHook = SetWindowsHookEx(WH_MOUSE, MouseProc, hInst, 0);
    hAppWnd = hWnd;
    return hHook;
}


void APIENTRY UnSetHook()
{
     UnhookWindowsHookEx(hHook);
}


DEF ファイル
LIBRARY   名称

CODE      PRELOAD MOVEABLE DISCARDABLE
DATA      PRELOAD SINGLE

EXPORTS
MouseProc       @2
SetHook         @3
UnSetHook       @4


参照
DEFファイルの意味
フック
前後のTips
マウスのフック

DSS ProgrammingTipsCGI Ver1.02