C语言 Non-blocking ReadConsoleInput



我正在编写一个与鼠标交互的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 中

相关内容

  • 没有找到相关文章

最新更新