非阻塞ReadConsoleInput

时间:2017-10-10 04:08:20

标签: c windows winapi console mouse

我正在编写一个与鼠标交互的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离开鼠标光标。这是无法正常工作,因为ReadConsoleInput将阻止,直到收到输入。

在收到更多输入之前,不会打印0。除非用户不断地敲击键盘,否则不会打印任何内容,因为无论何时移动鼠标,屏幕都会被清除。

问题

即使没有输入,我希望循环继续。 ReadConsoleInput等待读取输入,这意味着循环将暂停,直到键盘被击中或鼠标移动。

我正在寻找ReadConsoleInput的替代品,或者让它成为非阻挡的方法。

1 个答案:

答案 0 :(得分:2)

ReadConsoleInput中记录了这一切。您可以使用GetNumberOfConsoleInputEvents确定是否存在控制台输入。您可以使用PeekConsoleInput确定控制台输入事件的类型。

所以你需要GetNumberOfConsoleInputEvents

您还可以使用WaitForSingleObject和控制台句柄等待下一个可用输入。这也记录在ReadConsoleInput