我正在编写一个与鼠标交互的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
的替代方法,或者使其非阻塞的方法。
WaitForSingleObject
或任何其他带有内部阻塞逻辑的函数,例如ReadConsole
。您甚至不应该调用这些函数,因为基本上您应该将数据管道传输到输出句柄,这意味着在输入被阻塞时,句柄可能已经关闭/损坏/分离。即使没有输入数据,您也必须始终测试输出。WaitForSingleObject
或ReadConsole
无法通过设计来处理此问题。这是Windows控制台中已知的设计缺陷。 - Andry