簡體   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