2017-02-13 3 views
2

Я работаю над консольным проектом в C++ с визуальной студией, в которой мышь делает все входные данные. Он отлично работает на окнах 7, но не на окнах 10.Console Mouse Input не работает

Я покажу вам код, который является очень простой версией моего фактического кода. Но здесь тот же: работает на win7, а не на победу 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); 
} 
+0

Большие изменения в Win10 из-за подсистемы Linux. Вы отключили ENABLE_PROCESSED_INPUT, это почему-то не нравится. –

+0

Итак, как я могу включить его? и есть ли какой-нибудь документ, который я могу прочитать, как обращаться с изменениями? я действительно пытаюсь его решить. но спасибо до сих пор! –

+0

fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | ENABLE_PROCESSED_INPUT; Теперь это работает. –

ответ

1

Я был similar problem на моем Windows, 10 машины. И проблема, казалось бы, вызвана «Режим быстрого редактирования» параметр включен в настройках «Свойства Windows консоли» в Windows10. Я скопировал и вставил ваш MCVE-код, он тоже не работал на моем компьютере с Windows10. Но он начал работать после того, как я отключил «Режим быстрого редактирования» по Microsoft's docs about disabling 'Quick Edit Mode'. Я сделал это «отключить» вещи первой, перед включением в окне ввода & мыши события, путем включения/добавлении «Быстрое редактирование Mode'-инвалидизирующей-кодовые строк в свой код в следующем порядке (!):

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

После этого вышеприведенным включения, программа начала работать и консоль Cursor хранится после моего указателя мыши с помощью вашей gotoxy() функции, как задумано вашего условии MCVE-коды, на моем Windows 10-консоль!