2401_87739317 2025-10-01 16:26 采纳率: 0%
浏览 9

easyx库利用ExMessage获取不了键盘消息

为什么我用easyx库里面的ExMessage消息结构体不能获取键盘输入,

void SingleMode(ExMessage* pmsg, bool* music) {

    cleardevice();  //清屏

    EndBatchDraw();  //结束双缓冲

    while (true) {

        while (peekmessage(pmsg, EX_MOUSE)) {  //获取鼠标消息
            if (pmsg->message == WM_LBUTTONDOWN) {
                if (pmsg->x >= 0 && pmsg->x <= 80 && pmsg->y >= 0 && pmsg->y <= 80) {  //点击返回按钮
                    return;
                }
            }
        }

        while (peekmessage(pmsg, EX_KEY)) {  //获取键盘消息
            if (pmsg->message == WM_KEYDOWN) {
                if (pmsg->vkcode == VK_SPACE) {  //空格键按下

                }
                if (pmsg->vkcode == VK_A || pmsg->vkcode == VK_LEFT) {  //向左
                    printf("左\n");
                    fflush(stdout);
                }
                if (pmsg->vkcode == VK_D || pmsg->vkcode == VK_RIGHT) {  //向右
                    printf("右\n");
                    fflush(stdout);
                }
                if (pmsg->vkcode == VK_W || pmsg->vkcode == VK_UP) {  //向上
                    printf("上\n");
                    fflush(stdout);
                }
                if (pmsg->vkcode == VK_S || pmsg->vkcode == VK_DOWN) {  //向下
                    printf("下\n");
                    fflush(stdout);
                }
            }
        }

        BeginBatchDraw();  //开始双缓冲

        setfillcolor(BLACK);

        //绘制返回按钮
        setfillcolor(WHITE);
        POINT pt1[] = {
            {10,40},
            {40,10},
            {40,70}
        };
        int n1 = 3;
        fillpolygon(pt1, n1);  //三角形
        solidrectangle(40, 30, 70, 50);  //矩形

        EndBatchDraw();  //结束双缓冲

    }

}

鼠标消息能正常获取,点击返回能正常返回,但使用键盘输入'W''A''S''D'和上下左右的时候,控制台没反应,而且在电脑最左上角有图片里这样的输入框

img

img

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2025-10-01 16:26
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解决方案

    easyx库中的ExMessage结构体可能无法直接获取键盘输入,因为ExMessage主要用于处理鼠标事件和窗口消息,而键盘输入通常通过处理WndProc消息来处理。

    如果你需要获取键盘输入,可以尝试以下几种方法:

    1. 重写WndProc消息处理函数:你可以重写ExMessage的WndProc消息处理函数,从而处理WM_KEYDOWN等键盘相关消息。
    LRESULT CALLBACK wndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
        switch (msg) {
            case WM_KEYDOWN:
                // 处理WM_KEYDOWN消息
                break;
        }
        return ExMessage::WndProc(hwnd, msg, wParam, lParam);
    }
    
    1. 使用SetWindowLongA函数:你可以使用SetWindowLongA函数将WndProc消息处理函数设置为ExMessage的消息处理函数,进而处理键盘输入。
    SetWindowLongA(hwnd, GWL_WNDPROC, (LONG)wndProc);
    
    1. 利用 GetMessage 和 DispatchMessage:你可以使用GetMessage函数获取消息并使用DispatchMessage函数将消息传递给ExMessage处理。
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        DispatchMessage(&msg);
    }
    

    注意

    需要注意的是,上述方法可能需要调整easyx库的源码或你的程序代码,具体实现可能会有所不同。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月1日