我正在编写一个与鼠标交互的Win32控制台应用程序。我正在使用ReadConsoleInput
来获取与窗口相关的鼠标移动。以下是我的问题的简化版本:
int main(void)
{
HANDLE hStdin;
DWORD cNumRead;
INPUT_RECORD irInBuf[128];
hStdin = GetStdHandle(STD_INPUT_HANDLE);
SetConsoleMode(hStdin, ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | ENABLE_PROCESSED_INPUT);
while (1)
{
mouse_position_changed = 0;
ReadConsoleInput(hStdin, irInBuf, 128, &cNumRead);
/* input handler here: changes the cursor position if the mouse position changed;
clears screen if mouse position changed;
sets mouse_position_changed (self-explanatory).
(this part of the code is irrelevant to the quesiton at hand) */
if (!mouse_position_changed)
putchar('0');
}
}
(我删除了大部分代码,包括错误检查。这是我正在做的一个简单的、淡化的版本;它比使0远离光标要大得多。)
我希望屏幕被清除,每当鼠标移动时,光标都被设置为鼠标坐标。这部分正在工作。
我想在鼠标不移动时在屏幕上打印
0
。这将产生0离开鼠标光标的效果。这不起作用,因为ReadConsoleInput
将阻塞,直到它接收到输入。在收到更多输入之前,
0
不会打印。除非用户不断敲击键盘,否则不会打印任何内容,因为只要移动鼠标,屏幕就会被清除。问题
即使没有输入,我也希望循环继续。
ReadConsoleInput
等待读取输入,这意味着循环将暂停,直到键盘被击中或鼠标被移动为止。我正在寻找一种替代
ReadConsoleInput
的方法,或者一种使其不阻塞的方法。 最佳答案
所有这些都记录在ReadConsoleInput中。您可以确定是否有GetNumberOfConsoleInputEvents的控制台输入。您还可以使用PeekConsoleInput确定控制台输入事件的类型。
所以GetNumberOfConsoleInputEvents就是你所需要的。
您还可以使用WaitForSingleObject和控制台句柄来等待下一个可用的输入。这也记录在ReadConsoleInput