#include <windows.h>
HWND
hgWnd;
HHOOK
myhook;
LRESULT
CALLBACK MouseProc(
int
nCode,
WPARAM
wParam,
LPARAM
lParam)
{
LPMSLLHOOKSTRUCT p = (LPMSLLHOOKSTRUCT)lParam;
POINT pt = p->pt;
DWORD
mouseData = p->mouseData;
const
char
*info = NULL;
char
text[60], pData[50], mData[50];
PAINTSTRUCT ps;
HDC
hdc;
if
(nCode >= 0)
{
if
(wParam == WM_MOUSEMOVE) info =
"鼠标移动 "
;
else
if
(wParam == WM_LBUTTONDOWN) info =
"鼠标【左键】按下"
;
else
if
(wParam == WM_LBUTTONUP) info =
"鼠标【左键】抬起"
;
else
if
(wParam == WM_LBUTTONDBLCLK) info =
"鼠标【左键】双击"
;
else
if
(wParam == WM_RBUTTONDOWN) info =
"鼠标【右键】按下"
;
else
if
(wParam == WM_RBUTTONUP) info =
"鼠标【右键】抬起"
;
else
if
(wParam == WM_RBUTTONDBLCLK) info =
"鼠标【右键】双击"
;
else
if
(wParam == WM_MBUTTONDOWN) info =
"鼠标【滚轮】按下"
;
else
if
(wParam == WM_MBUTTONUP) info =
"鼠标【滚轮】抬起"
;
else
if
(wParam == WM_MBUTTONDBLCLK) info =
"鼠标【滚轮】双击"
;
else
if
(wParam == WM_MOUSEWHEEL) info =
"鼠标【滚轮】滚动"
;
ZeroMemory(text,
sizeof
(text));
ZeroMemory(pData,
sizeof
(pData));
ZeroMemory(mData,
sizeof
(mData));
wsprintf( text,
"当前状态: %10s "
, info);
wsprintf(pData,
"0x%x - X: [%04d], Y: [%04d] "
, wParam, pt.x, pt.y);
wsprintf(mData,
"附带数据: %16u "
, mouseData);
hdc = GetDC(hgWnd);
TextOut(hdc, 10, 10, text,
strlen
(text));
TextOut(hdc, 10, 30, pData,
strlen
(pData));
TextOut(hdc, 10, 50, mData,
strlen
(mData));
ReleaseDC(hgWnd,hdc);
}
return
CallNextHookEx(myhook, nCode, wParam, lParam);
}
LRESULT
CALLBACK WndProc(
HWND
hwnd,
UINT
msg,
WPARAM
wParam,
LPARAM
lParam)
{
hgWnd = hwnd;
switch
(msg)
{
case
WM_CLOSE:
DestroyWindow(hwnd);
break
;
case
WM_DESTROY:
PostQuitMessage(0);
break
;
default
:
return
DefWindowProc(hwnd, msg, wParam, lParam);
}
return
0;
}
int
WINAPI WinMain(
HINSTANCE
hInstance,
HINSTANCE
hPrevInstance,
LPSTR
lpCmdLine,
int
nCmdShow)
{
WNDCLASSEX wc;
HWND
hwnd;
MSG Msg;
char
text[30];
const
char
szClassName[] =
"myWindowClass"
;
wc.cbSize =
sizeof
(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (
HBRUSH
)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if
(!RegisterClassEx(&wc))
{
MessageBox(NULL, TEXT(
"窗口注册失败!"
), TEXT(
"错误"
), MB_ICONEXCLAMATION | MB_OK);
return
0;
}
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
szClassName,
TEXT(
"窗口标题"
),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 350, 200,
NULL,
NULL,
hInstance,
NULL
);
if
(hwnd == NULL)
{
MessageBox(NULL, TEXT(
"窗口创建失败"
), TEXT(
"错误"
),MB_ICONEXCLAMATION | MB_OK);
return
0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
myhook = SetWindowsHookEx(
WH_MOUSE_LL,
MouseProc,
hInstance,
0
);
if
(myhook == NULL)
{
wsprintf(text,
"键盘监听失败!error : %d \n"
, GetLastError());
MessageBox(hwnd, text, TEXT(
"错误"
), MB_OK);
}
while
(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return
Msg.wParam;
}