用C ++编写的键盘/鼠标输入

时间:2011-10-17 19:01:03

标签: c++ input keyboard mouse

我想知道如何在C ++中接受键盘和鼠标输入,使用Visual Studio 2010,适用于Windows 7 32位。

- 编辑:我忘了提到我需要键盘/鼠标输入而不会中断程序的流程。像听众一样。我不想暂停程序并要求输入,然后让用户输入并按Enter键。我正在寻找的更像是:

如果用户按下W,S,A,D - >;有事情发生。

或者:如果用户在 - >中按下leftmouse按钮;事情发生了。

我必须提到我对编程整体还是一个新手。我知道基本的OOP编程,但就是这样。我绝对肯定这会涉及我还不知道的事情,我不介意,我只是要求你彻底解释它,并且可能举一个例子,所以我知道如何使用它。

感谢。

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:8)

这背后有许多相关概念。

在非常低的级别,键盘和鼠标是硬件设备,它们向CPU产生一些“中断”(以电子信号的形式)。 操作系统提供一些驱动程序,通过解码设备通信特定协议来处理此类中断,并以事件的形式“标准化”(在操作系统级别)这些信号。 / p>

使用“控制台应用程序”,操作系统通过填充输入缓冲区(本质上是char [])来处理这些事件(特别是键盘),该缓冲区可以作为“几乎无限的字符序列”访问(复杂的名称)用于“文件”)命名为“CON”,从而模仿早期计算机的“无限电传模型”。 在C ++程序中,标准库-at程序启动 - 将std::cinstd::cout 对象的“文件”关联起来,这样您就可以使用它来读取输入字符序列std::istream函数和运算符。

遗憾的是,对于“图形应用程序”,没有模仿的“早期模型”,并且“事件”可用作操作系统本机结构。 不同的操作系统在表示和处理这些事件的方式上有所不同,但可以看到某些相似性。 对于Windows(因为您的问题是关于),典型的程序使用“消息循环”按顺序检索这些事件,其中调用某些OS API。 在该循环中,典型的程序还将调用另一个OS API来将这些事件分派给与先前创建的“窗口”相关联的适当的“回叫”过程。 该回调过程必须检测事件代码,适当地转换参数并管理它们执行所需的操作。

使用像http://www.winprog.org/tutorial/这样的WIN32编程教程可以看到更精确的细节。 大多数代码基本上都是C,因为C是API正式化的语言。 对于C ++,已经编写了许多库来表示OS对象是C ++类的形式,并将OS API映射到这些类成员。 这些库可以是特定于操作系统(如MFC,WTL ......)或“多平台”(它们存在于不同版本中,将各种操作系统的API映射到相同的C ++接口),如WxWidget,Qt,Gtk,Fltk。 ..

希望这可以为你提供更多提示。

答案 2 :(得分:0)

Windows或控制台?

如果是控制台,请使用:

std::cin >> myVar;

答案 3 :(得分:0)

如果您正在编写控制台应用程序,则可以使用scanf或cin来获取键盘输入。控制台应用程序不支持鼠标。

如果您正在编写GUI应用程序,则可以使用标准的Windows控件构建应用程序,这些控件具有鼠标和键盘输入的内置行为。您可以按原样使用这些可重复使用的控件,或者可以对它们进行扩充,使它们的行为与您的应用程序完全相同。

例如,在GUI应用程序中,您可以使用用户可以键入的标准编辑控件。当您的程序在其中输入文本时,您的程序会收到消息,并根据这些消息或其他事件,您可以检索文本并根据程序的要求执行操作。