Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Console Mouse Input not working

I am working on a console project in c++ with visual studio, in which the mouse is doing all the input stuff. It is working fine on windows 7, but not on windows 10.

I'll show you some code, which is a very simplefied version, of my actual code. But here is the same: working on win7, not on 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);
}
like image 783
Tobi M. Ottorony Avatar asked Feb 13 '17 20:02

Tobi M. Ottorony


1 Answers

I had similar problem on my Windows-10 machine. And the problem seemingly was being caused by 'Quick Edit Mode' option being enabled in settings of 'Console Windows Properties' on Windows10. I have copied and pasted your given MCVE-code, it wasn't working on my windows10 machine either. But, it started working after i disabled 'Quick Edit Mode' as per Microsoft's docs about disabling 'Quick Edit Mode'. I did this 'disabling' thing first(!), before enabling the window & mouse input events, by including/adding the 'Quick Edit Mode'-disabling-code-lines to your code in following manner:

    /* 
       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");

After this above-quoted inclusion, your program started working and the Console Cursor kept following my Mouse pointer via your gotoxy() function, as intended by your provided MCVE-code, on my Windows10-Console!

like image 142
FAQi Avatar answered Oct 24 '22 08:10

FAQi