c - 非阻塞 ReadConsoleInput

标签 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。这将产生 0 远离鼠标光标的效果。这不起作用,因为ReadConsoleInput将阻塞直到它接收到输入。

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

问题

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

我正在寻找 ReadConsoleInput 的替代方法,或者一种使其成为非阻塞的方法。

最佳答案

所有这些都记录在 ReadConsoleInput 中.您可以使用 GetNumberOfConsoleInputEvents 确定是否有控制台输入.您可以使用 PeekConsoleInput 确定控制台输入事件的类型.

所以 GetNumberOfConsoleInputEvents就是您所需要的。

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

关于c - 非阻塞 ReadConsoleInput,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46658472/

相关文章:

delphi - 如何使用AllowSetForegroundWindow?

c++ - 宏可以在 #if 中与非数值进行比较吗

java - 如何使用 JNA 获取 Activity 窗口的应用程序名称?

c - 从 'char *' 分配到 'int' 的指针转换不兼容的整数

windows - 使用 ReadDirectoryChangesw 时如何绕过 UAC?

c++ - gtkmm 和 MSAA 可访问性

windows - exe数据段中的数据

windows - 为什么较新的 Windows 版本仍支持某些旧的 Win16 API?

c - 右下对角打印二维数组

c - K&R 第 2 版,示例 1.9 字符数组