非阻塞式的ReadConsoleInput

3
我正在编写一个与鼠标交互的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的替代方法,或者使其非阻塞的方法。

1个回答

5

只是为了强调问题,要小心使用WaitForSingleObject或任何其他带有内部阻塞逻辑的函数,例如ReadConsole。您甚至不应该调用这些函数,因为基本上您应该将数据管道传输到输出句柄,这意味着在输入被阻塞时,句柄可能已经关闭/损坏/分离。即使没有输入数据,您也必须始终测试输出。WaitForSingleObjectReadConsole无法通过设计来处理此问题。这是Windows控制台中已知的设计缺陷。 - Andry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接