繁体   English   中英

非阻塞 ReadConsoleInput

[英]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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM