2014-04-19 150 views
-2

有人可以解釋此代碼的第一部分,以及如何啓用標準I/O的使用,而不是有限的範圍。提前致謝。什麼是wincon.h庫? 我想從鍵盤箭頭獲取輸入(領航員)鍵盤箭頭作爲輸入源

‪#‎include‬ <iostream> 
#include <windows.h> 
#include <conio.h> 
#include <wincon.h> 
void main() 
{ 
    HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); 
    DWORD NumInputs = 0; 
    DWORD InputsRead = 0; 
    bool running = true; 
    INPUT_RECORD irInput; 
    GetNumberOfConsoleInputEvents(hInput, &NumInputs); 
    while(running) 
    { 
    ReadConsoleInput(hInput, &irInput, 1, &InputsRead); 
    // std::cout << irInput.Event.KeyEvent.wVirtualKeyCode << std::endl; 
    switch(irInput.Event.KeyEvent.wVirtualKeyCode) 
    { 
    case VK_ESCAPE: 
    running = false; 
    //Quit The Running Loop 
    break; 
    case VK_LEFT: 
    case VK_NUMPAD4: 
    // move it left 
    std::cout << "left"; 
    break; 
    case VK_UP: 
    case VK_NUMPAD8: 
    // move it up 
    std::cout << " up" ; 
    break; 
    case VK_RIGHT: 
    case VK_NUMPAD6: 
    // move it right 
    std::cout << "Right"; 
    break; 
    case VK_DOWN: 
    case VK_NUMPAD2: 
    // move it down 
    std::cout << "down"; 
    break; 
    } 
    } 
    system ("pause"); 
    } 

回答

3

的C風格的標準控制檯I/O是所謂「熟」,意思是輸入沒有達到應用程序,直到它已被緩衝並完成(用戶點擊輸入)。要從控制檯執行「原始」I/O,需要使用系統特定的功能。在這種情況下,ReadConsoleInput功能和相關功能。

不幸的是,允許使用箭頭鍵和類似的命令並且同時使用標準的I/O功能是相當困難的。在大多數環境中可以做到這一點,但通常不會直接暴露所需的功能 - 換句話說,您無法「獲得」必須修改才能允許的位 - 您最終可能編寫自己的I/O功能,或者使用「標準方法」。根據你實際想要達到的目標,其中一個或另一個將是「正確的」解決方案。如果不知道你正在做什麼樣的應用程序以及你想要實現什麼,那是不可能的。

據我所知,在這種情況下,wincon.h是完全多餘的,不應該需要(我不認爲conio.h是必需的)。發佈的代碼也完全無用地調用GetNumberOfConsoleInputEvents - 如果您想要執行「按下按鍵」之類的操作,調用此選項可檢查輸入隊列中有多少按鍵,這將非常有用,您不想等待鍵盤輸入。

的代碼做什麼:

HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); 

取爲低級別的控制檯標準輸入的句柄。

DWORD NumInputs = 0; 
DWORD InputsRead = 0; 
bool running = true; 
INPUT_RECORD irInput; 
GetNumberOfConsoleInputEvents(hInput, &NumInputs); 

獲取控制檯「事件」的數量 - 換句話說,有多少按鍵是「等待」的。由於這些信息沒有在任何地方使用,所以在這個特定的例子中這是毫無意義的。

while(running) 
{ 
    ReadConsoleInput(hInput, &irInput, 1, &InputsRead); 

從控制檯讀取一個輸入。 (您應該檢查InputsRead之後是否包含1,並且檢查ReadConsoleInput的返回值,只是可以確定)。

// std::cout << irInput.Event.KeyEvent.wVirtualKeyCode << std::endl; 
    switch(irInput.Event.KeyEvent.wVirtualKeyCode) 

使用switch來區分不同的密鑰。

+0

非常感謝你的幫助,非常感謝。我不會自己編寫代碼,我試圖找到一種方法來使用鍵盤箭頭來獲取輸入,以便沿着我正在處理的遊戲中的列表上下移動光標,這就是我在上面找到的所以我想問。如果您可以建議更簡單或更清晰的其他方式,請提前致謝 –

+0

您的問題中的功能適用於閱讀「原始」鍵盤輸入。問題出在「混合」標準輸入。 –