c++ - 控制台鼠标输入不工作

标签 c++ visual-studio console windows-10

我正在使用 visual studio 使用 c++ 开发一个控制台项目,鼠标在其中执行所有输入操作。 它在 Windows 7 上运行良好,但在 Windows 10 上运行不正常。

我将向您展示一些代码,这是我实际代码的一个非常简单的版本。但这里是一样的:在 win7 上工作,而不是在 win 1 上工作

#include <stdio.h>
#include <windows.h>

void MouseEventProc(MOUSE_EVENT_RECORD);
VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD);
VOID KeyEventProc(KEY_EVENT_RECORD);
VOID GetInputEvents(VOID);
void gotoxy(int, int);

void MyErrorExit(char *s)
{
    printf("Fatal: %s\n", s);
    exit(1);
}

int main(void)
{
    HANDLE hStdin;
    DWORD cNumRead, fdwMode, fdwSaveOldMode, i;
    INPUT_RECORD irInBuf[128];

    // Get the standard input handle. 

    hStdin = GetStdHandle(STD_INPUT_HANDLE);
    if (hStdin == INVALID_HANDLE_VALUE)
        MyErrorExit("GetStdHandle");

    // Save the current input mode, to be restored on exit. 

    if (!GetConsoleMode(hStdin, &fdwSaveOldMode))
        MyErrorExit("GetConsoleMode");

    // Enable the window and mouse input events. 

    fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;
    if (!SetConsoleMode(hStdin, fdwMode))
        MyErrorExit("SetConsoleMode");

    // Loop to read and handle the input events. 

    while (1)
    {

        // Wait for the events. 

        if (!ReadConsoleInput(
            hStdin,      // input buffer handle 
            irInBuf,     // buffer to read into 
            128,         // size of read buffer 
            &cNumRead)) // number of records read 
            MyErrorExit("ReadConsoleInput");

        // Dispatch the events to the appropriate handler. 

        for (i = 0; i < cNumRead; i++)
        {
            switch (irInBuf[i].EventType)
            {
            case KEY_EVENT: // keyboard input 
                KeyEventProc(irInBuf[i].Event.KeyEvent);
                break;

            case MOUSE_EVENT: // mouse input 
                MouseEventProc(irInBuf[i].Event.MouseEvent);
                break;

            case WINDOW_BUFFER_SIZE_EVENT: // scrn buf. resizing 
                ResizeEventProc(
                    irInBuf[i].Event.WindowBufferSizeEvent);
                break;

            case FOCUS_EVENT:  // disregard focus events 

            case MENU_EVENT:   // disregard menu events 
                break;

            default:
                MyErrorExit("unknown event type");
                break;
            }
        }
    }

    return 0;
}

VOID MouseEventProc(MOUSE_EVENT_RECORD ir)
{
    if (ir.dwEventFlags == MOUSE_MOVED)
        gotoxy(ir.dwMousePosition.X, ir.dwMousePosition.Y);
}

VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD dummy) { return; };
VOID KeyEventProc(KEY_EVENT_RECORD dummy) { return; };
VOID GetInputEvents(VOID) { return; };

void gotoxy(int x, int y)
{
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

最佳答案

我有 similar problem在我的 Windows-10 机器上。问题似乎是由在 Windows10 的“控制台 Windows 属性”设置中启用的“快速编辑模式”选项引起的。我已经复制并粘贴了您给定的 MCVE 代码,它在我的 windows10 机器上也不起作用。但是,在我根据 Microsoft's docs about disabling 'Quick Edit Mode' 禁用“快速编辑模式” 后它开始工作了.在启用窗口和鼠标输入事件之前,我通过包含/添加“快速编辑模式”-disabling-code-lines 按照以下方式添加到您的代码中:

    /* 
       Step-1:
       Disable 'Quick Edit Mode' option
    */
       fdwMode = ENABLE_EXTENDED_FLAGS;
       if (! SetConsoleMode(hStdin, fdwMode) )
           MyErrorExit("SetConsoleMode");
    /* 
       Step-2:
       Enable the window and mouse input events,
       after you have already applied that 'ENABLE_EXTENDED_FLAGS'
       to disable 'Quick Edit Mode'
    */
       fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;
       if (!SetConsoleMode(hStdin, fdwMode))
           MyErrorExit("SetConsoleMode");

在上面引用的包含之后,您的程序开始工作,并且控制台光标通过您的 gotoxy() 函数继续跟随我的鼠标指针,正如您提供的 MCVE 代码所预期的那样,在我的 Windows10-控制台!

关于c++ - 控制台鼠标输入不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42213161/

相关文章:

c++ - 如何在C/C++中输出unicode字符

c++ - 重复的 switch 语句需要重构

windows - 如何通过 premake5 将全局属性添加到生成的 Visual Studio 项目和解决方案中?

c++ - QT - 连接Qml按钮点击Cpp构造函数

c++ - 如何让 DCMTK 库在 Qt Creator 中工作?

c++ - 通过不明确的转换运算符进行引用绑定(bind)

console - Qt 创作者 : Run in Terminal

c# - 从 WPF 应用程序附加到现有控制台的解决方法?

java - 如何从 jni 代码 junit 测试回调

c++ - 嵌套类成员函数不能访问封闭类的函数。为什么?