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);
}
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!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With