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ファイルの意味
フック