/* *Hook(钩子): *(1)进程内钩子 *(2)全局钩子 *Windows消息机制: */ #include
#include
HWND hWnd; //窗口句柄 HHOOK g_mouseHook; //钩子函数句柄 HHOOK g_keyboarHook; //键盘钩子函数句柄 //窗口处理函数 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); //鼠标钩子处理函数 LRESULT CALLBACK MouseProc(int nCod, WPARAM wParam, LPARAM lParam); //键盘钩子处理函数 LRESULT CALLBACK KeyboardProc(int nCod, WPARAM wParam, LPARAM lParam); /* CUI:控制台应用程序=>main GUI:图形界面=>WinMain */ //HINSTANCE:应用程序实例句柄类型 //LPSTR:char*命令行参数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR IpCmdLine, int nCmdShow) {
//①设计窗口类 TCHAR szAppClassName[] = TEXT("TEST");//TEXT:字符宏,自动适应字符集 WNDCLASS wndClass = {
0 }; wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //加载白色画刷 wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //加载光标 wndClass.hInstance = hInstance; //当前应用程序实例句柄 wndClass.lpfnWndProc = WindowProc; //窗口处理函数 wndClass.lpszClassName = szAppClassName; wndClass.style = CS_HREDRAW | CS_VREDRAW; //窗口类的风格 //②注册窗口类 RegisterClass(&wndClass); //③创建窗口,返回窗口句柄 hWnd = CreateWindow(szAppClassName, TEXT("窗口标题"), WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MINIMIZEBOX, 500, 200, 600, 400, NULL, NULL, hInstance, NULL); //④显示和更新窗口 ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); //⑤消息循环 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) //获取到WM_QUIT消息,返回0,结束循环 {
//将虚拟键消息转换为字符消息,键盘上每个键都有一个虚拟键值 TranslateMessage(&msg); //将消息分发给窗口处理函数 DispatchMessage(&msg); } return 0; } /* HWND:窗口句柄,用来区分窗口的 UINT:unsigned int UINT_PTR:UINT_PTR uint指针 LPARAM:LONG_PTR long指针 */ LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
PAINTSTRUCT ps; HDC hDC; switch (uMsg) {
case WM_CREATE: //窗口创建消息 //安装鼠标钩子 g_mouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, NULL, GetCurrentThreadId()); //安装键盘钩子 g_keyboarHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, GetCurrentThreadId()); break; case WM_CLOSE://窗口关闭消息 DestroyWindow(hwnd); //销毁窗口 break; case WM_DESTROY: //窗口销毁消息 PostQuitMessage(0); break; case WM_PAINT: //窗口绘图消息 {
hDC = BeginPaint(hwnd, &ps); HPEN Pen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0)); SelectObject(hDC, Pen); Ellipse(hDC, 0, 0, 200, 200); EndPaint(hwnd, &ps); break; } case WM_LBUTTONDOWN: //鼠标左键按下消息 MessageBox(hwnd, TEXT("弹吉他"), TEXT("温馨提示"), MB_OK | MB_OKCANCEL); break; case WM_RBUTTONDOWN: //鼠标右键按下消息 break; case WM_MOUSEMOVE: //鼠标移动消息 {
int x = LOWORD(lParam); //x坐标 int y = HIWORD(lParam); //y坐标 wchar_t str[50]; wsprintf(str, L"当前鼠标坐标(%d,%d)", x, y); SetWindowText(hwnd, str); break; } case WM_KEYDOWN: {
MessageBox(hwnd,L"键盘按下",L"提示",MB_OK); break; } default: break; } return DefWindowProc(hwnd, uMsg, wParam, lParam); } LRESULT CALLBACK MouseProc(int nCod, WPARAM wParam, LPARAM lParam) {
return CallNextHookEx(g_mouseHook,nCod,wParam,lParam); //return 1; //返回非0,表示已经对这个消息进行了处理,这样的话系统不会将这个消息传递给程序了。(屏蔽消息),一般不这样做 } LRESULT CALLBACK KeyboardProc(int nCod, WPARAM wParam, LPARAM lParam) {
//屏蔽空格按键和回车键 if (wParam == VK_SPACE||wParam == VK_RETURN) {
return 1; } //按F2关闭窗口 if (wParam == VK_F2) {
SendMessage(hWnd,WM_CLOSE,0,0); //卸载钩子 UnhookWindowsHookEx(g_mouseHook); UnhookWindowsHookEx(g_keyboarHook); return 1; } return CallNextHookEx(g_keyboarHook, nCod, wParam, lParam); //return 1; //返回非0,表示已经对这个消息进行了处理,这样的话系统不会将这个消息传递给程序了,屏蔽所有按键 }
https://www.bilibili.com/video/BV1n4411c77j?t=4510
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225193.html原文链接:https://javaforall.net
