当程序从* .bat / * .cmd文件或控制台运行时,如何使ReadConsoleInput通知MOUSE_EVENT?

时间:2014-05-14 22:10:43

标签: c++ winapi batch-file console mouseevent

通过单击exe文件直接编译和运行此代码可以正常工作。但是当由* .cmd文件运行或在控制台中键入它的名称时,事件将不会显示。有没有办法解决这个问题?

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

int main() {
  HANDLE input_handle = GetStdHandle(STD_INPUT_HANDLE);
  INPUT_RECORD input_record;
  DWORD input_size = 1;
  DWORD events = 0;
  do {
    FlushConsoleInputBuffer(input_handle);
    ReadConsoleInput(input_handle, &input_record, input_size, &events);
    if (input_record.EventType == MOUSE_EVENT) {
      std::cout << " X:" << input_record.Event.MouseEvent.dwMousePosition.X
                << " Y:" << input_record.Event.MouseEvent.dwMousePosition.Y
                << std::endl;
    }
    else if (input_record.EventType == KEY_EVENT) {
      std::cout << input_record.Event.KeyEvent.wVirtualKeyCode << std::endl;
    }
  } while(input_record.Event.KeyEvent.wVirtualKeyCode != VK_ESCAPE);
  return 0;
}

但关键事件在两种情况下均有效,只过滤掉鼠标事件

1 个答案:

答案 0 :(得分:2)

SetConsoleMode函数的 dwMode 参数文档指定:

ENABLE_QUICK_EDIT_MODE  0x0040 
This flag enables the user to use the mouse to select and edit text. 

To enable this mode, use ENABLE_QUICK_EDIT_MODE | ENABLE_EXTENDED_FLAGS.
To disable this mode, use ENABLE_EXTENDED_FLAGS without this flag.

启用此模式(默认设置)时,cmd.exe使用鼠标允许用户从命令行窗口屏幕中选择文本。此外,似乎在某些Windows版本(如Vista和/或7)中,默认情况下不启用cmd.exe中的鼠标输入。

如果您希望程序获得鼠标事件,则必须启用鼠标输入并以这种方式禁用快速编辑模式:

GetConsoleMode ( input_handle, &dwOldMode );
SetConsoleMode ( input_handle, ENABLE_MOUSE_INPUT | ENABLE_EXTENDED_FLAGS );

也许您可能希望保留dwOldMode中的其他模式标志,只需修改之前的模式标志即可。无论如何,你必须在程序结束之前恢复原始模式:

SetConsoleMode ( input_handle, dwOldMode );