Eason_CM 2025-08-19 13:22 采纳率: 100%
浏览 9
已结题

C++使用WINDOWS API创建的窗口能不能使用事件处理器检测用户按下鼠标,并给出鼠标的坐标?(那键盘呢?)

C++使用WINDOWS API创建的窗口能不能使用事件处理器检测用户按下鼠标,并给出鼠标的坐标?(那键盘呢?)

  • 写回答

6条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-08-19 13:26
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析:
      - 要使用Windows API在C++中创建窗口并检测鼠标事件(按下及获取坐标)和键盘事件。需要了解Windows API中与窗口创建、消息处理相关的函数,特别是鼠标和键盘事件对应的消息。
    2. 解决方案:
      - 窗口创建
      使用CreateWindow函数创建窗口。示例代码如下:
    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
        static TCHAR szAppName[] = TEXT("MouseAndKeyboard");
        HWND hwnd;
        MSG msg;
        WNDCLASS wndclass;
    
        wndclass.style = CS_HREDRAW | CS_VREDRAW;
        wndclass.lpfnWndProc = WndProc;
        wndclass.cbClsExtra = 0;
        wndclass.cbWndExtra = 0;
        wndclass.hInstance = hInstance;
        wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
        wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wndclass.lpszMenuName = NULL;
        wndclass.lpszClassName = szAppName;
    
        if (!RegisterClass(&wndclass))
        {
            MessageBox(NULL, TEXT("This program requires Windows NT!"),
                       szAppName, MB_ICONERROR);
            return 0;
        }
    
        hwnd = CreateWindow(
            szAppName,                  // window class name
            TEXT("Mouse and Keyboard"), // window caption
            WS_OVERLAPPEDWINDOW,       // window style
            CW_USEDEFAULT,              // initial x position
            CW_USEDEFAULT,              // initial y position
            CW_USEDEFAULT,              // initial x size
            CW_USEDEFAULT,              // initial y size
            NULL,                       // parent window handle
            NULL,                       // window menu handle
            hInstance,                  // program instance handle
            NULL                        // creation parameters
        );
    
        ShowWindow(hwnd, iCmdShow);
        UpdateWindow(hwnd);
    
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        HDC hdc;
        PAINTSTRUCT ps;
        switch (message)
        {
        case WM_CREATE:
            return 0;
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
    
            EndPaint(hwnd, &ps);
            return 0;
        case WM_LBUTTONDOWN:
            {
                int x = LOWORD(lParam);
                int y = HIWORD(lParam);
                TCHAR szMessage[100];
                wsprintf(szMessage, TEXT("Left button clicked at (%d, %d)"), x, y);
                MessageBox(hwnd, szMessage, TEXT("Mouse Click"), MB_OK);
            }
            return 0;
        case WM_KEYDOWN:
            {
                TCHAR szMessage[100];
                wsprintf(szMessage, TEXT("Key %d pressed"), wParam);
                MessageBox(hwnd, szMessage, TEXT("Key Press"), MB_OK);
            }
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        }
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    
    • 鼠标事件处理
      在窗口过程函数WndProc中,通过处理WM_LBUTTONDOWN消息来检测鼠标左键按下事件,并通过lParam参数获取鼠标坐标。lParam的低16位是x坐标,高16位是y坐标,使用LOWORD(lParam)HIWORD(lParam)宏来分别获取。
    • 键盘事件处理
      在窗口过程函数WndProc中,通过处理WM_KEYDOWN消息来检测键盘按键按下事件,并通过wParam参数获取按键的虚拟键码。可以根据虚拟键码进一步判断具体按下的键。
      3. 多种解决方案及优缺点:
    • 使用Windows API原生方式
      • 优点
      • 直接与操作系统底层交互,性能高,对窗口的控制非常灵活,可以精确处理各种复杂的窗口相关操作。
      • 能深入了解Windows系统的消息机制,对于开发底层应用或对性能要求极高的程序很有帮助。
      • 缺点
      • 代码相对复杂,需要对Windows API有深入的了解,编写和维护成本较高。
      • 不同Windows版本可能有一些细微差异,需要注意兼容性问题。
    • 使用一些图形库如MFC(Microsoft Foundation Classes)
      • 优点
      • 封装了很多Windows API,提供了更面向对象的编程方式,代码相对简洁,开发效率较高。
      • 有丰富的控件和类可以直接使用,减少了底层代码的编写量。
      • 缺点
      • 增加了程序的依赖,MFC库比较庞大,可能会增加程序的体积。
      • 对于一些追求极致性能或对底层控制要求高的场景不太适用。
        4. 总结:
    • 使用Windows API可以在C++中创建窗口并检测鼠标和键盘事件。通过在窗口过程函数中处理相应的消息,能够准确获取鼠标坐标和键盘按键信息。这种方式虽然代码相对复杂,但能实现对窗口的精细控制,适合开发各种Windows桌面应用程序。

    在上述代码中,通过WM_LBUTTONDOWN处理鼠标左键按下事件获取坐标,通过WM_KEYDOWN处理键盘按键按下事件获取按键虚拟键码。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 8月27日
  • 已采纳回答 8月19日
  • 创建了问题 8月19日