通过单击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;
}
但关键事件在两种情况下均有效,只过滤掉鼠标事件
答案 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 );