2011-10-17 182 views
5

我想知道如何接受鍵盤和鼠標輸入的C + +,使用Visual Studio 2010,Windows 7 32位。鍵盤/鼠標輸入C++

- EDIT:我忘了提及我需要鍵盤/鼠標輸入而不中斷程序流。像聽衆一樣。我不想暫停程序並要求輸入,然後讓用戶輸入並按回車鍵。我正在尋找的是更像是:

如果用戶按下W,S,A,D - >事情發生。

或者:如果用戶在 - >事情發生時按下鼠標左鍵。

我不得不提到,我作爲一個整體編程還是很新的。我知道基本的OOP編程,但這就是它。我確定這會涉及到我還不知道的事情,我不介意,我只是要求你徹底解釋它,並且可能舉一個例子,以便我知道如何使用它。

謝謝。

+1

如果你正在寫一個C++控制檯應用程序的鍵盤/鼠標輸入,這是相當比你想象的有點困難。你必須聽取各種消息的Windows消息泵,並解釋它們。這打開了一整罐蠕蟲。 –

回答

13

不中斷流動

#include <windows.h> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    HANDLE hIn; 
    HANDLE hOut; 
    COORD KeyWhere; 
    COORD MouseWhere; 
    COORD EndWhere; 
    bool Continue = TRUE; 
    int KeyEvents = 0; 
    int MouseEvents = 0; 
    INPUT_RECORD InRec; 
    DWORD NumRead; 

    hIn = GetStdHandle(STD_INPUT_HANDLE); 
    hOut = GetStdHandle(STD_OUTPUT_HANDLE); 

    cout << "Key Events : " << endl; 
    cout << "Mouse Events : " << flush; 

    KeyWhere.X = 15; 
    KeyWhere.Y = 0; 
    MouseWhere.X = 15; 
    MouseWhere.Y = 1; 
    EndWhere.X = 0; 
    EndWhere.Y = 3; 

    while (Continue) 
    { 
     ReadConsoleInput(hIn, 
         &InRec, 
         1, 
         &NumRead); 

     switch (InRec.EventType) 
     { 
     case KEY_EVENT: 
      ++KeyEvents; 
      SetConsoleCursorPosition(hOut, 
            KeyWhere); 
      cout << KeyEvents << flush; 
      if (InRec.Event.KeyEvent.uChar.AsciiChar == 'x') 
      { 
       SetConsoleCursorPosition(hOut, 
             EndWhere); 
       cout << "Exiting..." << endl; 
       Continue = FALSE; 
      } 
      break; 

     case MOUSE_EVENT: 
      ++MouseEvents; 
      SetConsoleCursorPosition(hOut, 
            MouseWhere); 
      cout << MouseEvents << flush; 
      break; 
     } 
    } 

    return 0; 
} 
+0

非常感謝您的時間。我發現這非常有幫助。 – Rohit

+0

我想知道如果你能告訴我如何檢查一個按鍵是單獨按下/釋放的,而不是整個關鍵事件? – Rohit

+0

示例應用程序: http://www.codeproject.com/KB/cpp/conslRndJkGn.aspx –

0

Windows還是Console?

如果控制檯,使用方法:

std::cin >> myVar; 
+0

對不起,我忘記提及我正在嘗試接受輸入而不中斷程序。我已經編輯了我的原始問題以反映現在。感謝您花時間回答。 – Rohit

0

如果你正在寫一個控制檯應用程序,你可以使用scanf或CIN獲得鍵盤輸入。控制檯應用程序不支持鼠標。

如果您正在編寫一個GUI應用程序,那麼您將使用標準Windows控件構建應用程序,該控件具有鼠標和鍵盤輸入的內置行爲。您可以按原樣使用這些可重用的控件,也可以對它們進行擴充以使它們的行爲完全符合您的應用程序需求。

例如,在一個GUI應用程序中,有一個標準的編輯控件可供用戶輸入。當用戶輸入文本時,程序會收到消息,根據這些消息或其他事件,您可以根據程序的要求檢索文本並對其進行處理。

+0

對不起,我忘了提及我正在嘗試接受輸入而不中斷程序。我已經編輯了我的原始問題以反映現在。感謝您花時間回答 – Rohit

7

背後有許多相關的概念。

在非常低的水平上,鍵盤和鼠標是硬件設備,它會向CPU產生一些「中斷」(以電信號的形式)。操作系統提供一些驅動程序,其通過解碼設備通信特定協議來處理這種中斷,並且以事件的形式「標準化」(在OS級)這些信號。

對於「控制檯應用程序」,操作系統通過填充輸入緩衝區(本質上是char [])來處理這些事件(特別是鍵盤),該輸入緩衝區可作爲「幾乎無限的字符序列」名稱爲「文件」)名爲「CON」,因此模仿早期電腦的「無限電傳模式」。 在C++程序中,標準庫(在程序啓動時)會將該文件與std::cinstd::cout關聯起來,因此您可以使用std::istream函數和運算符讀取輸入字符序列。

對於「圖形應用程序」,不幸的是,沒有「早期模型」來模仿,並且「事件」作爲操作系統原生結構可用。 不同的操作系統在表示和處理這些事件的方式上有所不同,但可以看到某些相似之處。 對於Windows(因爲你的問題是關於),一個典型的程序依次通過調用某些OS API的「消息循環」來檢索這些事件。 在那個循環中,典型的程序也會調用另一個OS API來將這些事件分派到與之前創建的「窗口」相關的適當的「回調」過程。 該回調過程必須檢測事件代碼,根據需要強制轉換參數並管理它們,執行所需的操作。

使用WIN32編程教程如http://www.winprog.org/tutorial/可以看到更精確的細節。 大部分代碼基本上都是C,因爲C是API正式化的語言。 對於C++,隨後編寫了許多庫來表示OS對象是C++類的形式,並將OS API映射到這些類成員。 像WxWidget,Qt,Gtk,Fltk這些庫可以是OS特定的(如MFC,WTL ...)或「 ...

希望這可以給你更多的提示思考。

+0

非常感謝^^。當涉及到背後的理論時,這確實有幫助。 – Rohit

+0

有用的,我認爲,必要的OP。++ –