OSDN Git Service

v0.0.1 release
[winautomata/winautomata.git] / mousehook_lib.c
1 #include <windows.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 static HHOOK hMyHook = NULL;
6
7 HINSTANCE hInstance;
8
9 BOOL WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, LPVOID lpvReserved)
10 {
11     if(fdwReason == DLL_PROCESS_ATTACH) {
12         hInstance = hInst;
13     }
14
15     return TRUE;
16 }
17
18 LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
19 {
20     if(nCode < 0) {
21         return CallNextHookEx(hMyHook, nCode, wParam, lParam);
22     }
23     else if(nCode == HC_ACTION) {
24         if(wParam == WM_LBUTTONDOWN) {
25             LPMOUSEHOOKSTRUCT lpMouseStruct = (LPMOUSEHOOKSTRUCT)lParam;
26
27             printf("clicked(left) x %d y %d\n", lpMouseStruct->pt.x, lpMouseStruct->pt.y);
28             return CallNextHookEx(hMyHook, nCode, wParam, lParam);
29         }
30         else if(wParam == WM_RBUTTONDOWN) {
31             LPMOUSEHOOKSTRUCT lpMouseStruct = (LPMOUSEHOOKSTRUCT)lParam;
32
33             printf("clicked(right) x %d y %d\n", lpMouseStruct->pt.x, lpMouseStruct->pt.y);
34             return CallNextHookEx(hMyHook, nCode, wParam, lParam);
35         }
36         else if(wParam == WM_MOUSEMOVE) {
37             LPMOUSEHOOKSTRUCT lpMouseStruct = (LPMOUSEHOOKSTRUCT)lParam;
38
39             printf("moving x %d y %d\n", lpMouseStruct->pt.x, lpMouseStruct->pt.y);
40             return CallNextHookEx(hMyHook, nCode, wParam, lParam);
41         }
42         else {
43             return CallNextHookEx(hMyHook, nCode, wParam, lParam);
44         }
45     }
46     else {
47         return CallNextHookEx(hMyHook, nCode, wParam, lParam);
48     }
49 }
50
51 __declspec(dllexport) __stdcall void SetHook(HINSTANCE hModule)
52 {
53     hMyHook = SetWindowsHookEx(WH_MOUSE_LL
54         , MouseProc
55         , hModule 
56         , 0); 
57
58     if(hMyHook == NULL) 
59     {
60         LPVOID lpMsgBuf;
61         FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&lpMsgBuf, 0, NULL);
62         printf("%s", lpMsgBuf);
63         LocalFree(lpMsgBuf);
64         exit(0);
65     }
66 }
67
68 __declspec(dllexport) __stdcall void RemoveHook()
69 {
70     if(hMyHook) {
71         (void)UnhookWindowsHookEx(hMyHook);
72         hMyHook = NULL;
73     }
74 }
75