2017-02-13 53 views
2

我正在使用Visual Studio在C++中進行控制檯項目,其中鼠標正在執行所有輸入內容。 它在Windows 7上工作正常,但不在Windows 10上。控制檯鼠標輸入不起作用

我會告訴你一些代碼,這是一個非常簡單的版本,我的實際代碼。但這裏是相同的:工作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

由於Linux子系統的原因,Win10發生了很大的變化。您禁用了ENABLE_PROCESSED_INPUT,出於某種原因並不高興。 –

+0

那麼我如何啓用它?是否有任何文件可以閱讀如何處理更改?我真的試圖解決它。但迄今爲止感謝! –

+0

fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | ENABLE_PROCESSED_INPUT;現在它可以工作。 –

回答

1

我在我的Windows 10的機器上有similar problem。這個問題似乎是由於在Windows10的「控制檯Windows屬性」設置中啓用了「快速編輯模式」選項而導致的。我已經複製並粘貼了您給定的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"); 

這上面引述的夾雜物後,你的程序開始工作,控制檯光標不停地通過您的gotoxy()功能如下我的鼠標指針,按預期由您提供的MCVE代碼,在我的Windows10-控制檯