web-dev-qa-db-ja.com

C ++でのキーボード/マウス入力

Visual Studio 2010を使用して、Windows 732ビット用のC++でキーボードとマウスの入力を受け入れる方法を知りたいです。

-編集:プログラムの流れを中断せずにキーボード/マウス入力が必要であることを忘れました。リスナーのようなもの。プログラムを一時停止して入力を求めてから、ユーザーに入力してEnterキーを押す必要はありません。私が探しているのはもっと似ています:

ユーザーがW、S、A、Dを押すと、何かが起こります。

または:ユーザーが->で左マウスボタンを押すと何かが起こります。

私はまだプログラミング全体に非常に慣れていないことを言及しなければなりません。私は基本的なOOPプログラミングを知っていますが、それだけです。これにはまだ知らないことが含まれると確信しています。気にしないでください。説明をお願いします。それを徹底的に、そしておそらく例を挙げて、私はそれを使用する方法を知っています。

ありがとう。

8
Rohit

フローを中断せずにキーボード/マウス入力

#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;
}
14

これには、関連する概念がいくつかあります。

非常に低いレベルでは、キーボードとマウスは、CPUに「割り込み」(電気信号の形式で)を生成するハードウェアデバイスです。オペレーティングシステムは、デバイス通信固有のプロトコルをデコードし、それらの信号をeventsの形式で(OSレベルで)「標準化」することによってそのような割り込みを処理するいくつかのdriversを提供します。

「コンソールアプリケーション」では、オペレーティングシステムは、「事実上無限の文字シーケンス」(「ファイル」の複雑な名前)としてアクセスできる入力バッファ(基本的にはchar [])をいっぱいにすることで、これらのイベント(特にキーボード)を処理します。 ")「CON」という名前で、初期のコンピュータの「無限テレタイプモデル」を模倣しています。 C++プログラムでは、標準ライブラリ(プログラムの起動時)がその「ファイル」にstd::cinおよびstd::coutstreamオブジェクトを関連付けるため、を使用して入力文字シーケンスを読み取ることができます。 std::istream関数と演算子。

残念ながら、「グラフィカルアプリケーション」では、模倣する「初期モデル」はなく、「イベント」はオペレーティングシステムのネイティブ構造として利用できるままになっています。オペレーティングシステムが異なれば、そのようなイベントの表現方法や処理方法も異なりますが、一定の類似性が見られます。 Windowsの場合(質問はについてです)、一般的なプログラムは、特定のOSAPIを呼び出す「メッセージループ」を使用してこれらのイベントを順番に取得します。そのループでは、通常のプログラムは、別のOS APIを呼び出して、以前に作成された「ウィンドウ」に関連付けられた適切な「コールバック」プロシージャにそれらのイベントをディスパッチします。そのコールバックプロシージャは、イベントコードを検出し、必要に応じてパラメータをキャストし、必要なアクションを実行してそれらを管理する必要があります。

より正確な詳細は、 http://www.winprog.org/tutorial/ のようなWIN32プログラミングチュートリアルで見ることができます。 CはAPIが形式化される言語であるため、ほとんどのコードは本質的にCです。 C++の場合、OSオブジェクトを表すために多数のライブラリが作成されています。これはC++クラスの形式であり、OSAPIをそれらのクラスメンバーにマッピングします。これらのライブラリは、OS固有(MFC、WTLなど)または「マルチプラットフォーム」(異なるバージョンで存在し、さまざまなOSのAPIを同じC++インターフェイスにマッピング)(WxWidget、Qt、Gtk、Fltkなど)のいずれかになります。 ..

これがあなたに考えるためのより多くのヒントを与えることができることを願っています。

11

Windowsまたはコンソール?

コンソールの場合は、以下を使用します。

std::cin >> myVar;
0
Triton Man

コンソールアプリケーションを作成している場合は、scanfまたはcinを使用してキーボード入力を取得できます。コンソールアプリケーションは、マウスをサポートしていません。

GUIアプリケーションを作成している場合は、マウスとキーボードの入力の動作が組み込まれている標準のウィンドウコントロールからアプリを構築します。これらの再利用可能なコントロールをそのまま使用することも、アプリケーションに必要な動作を正確に行うように拡張することもできます。

たとえば、GUIアプリケーションには、ユーザーが入力できる標準の編集コントロールがあります。ユーザーがテキストを入力すると、プログラムはメッセージを受信します。これらのメッセージやその他のイベントに基づいて、プログラムで必要に応じてテキストを取得し、処理を行うことができます。

0
Colen