我想知道如何在C ++中接受键盘和鼠标输入,使用Visual Studio 2010,适用于Windows 7 32位。
- 编辑:我忘了提到我需要键盘/鼠标输入而不会中断程序的流程。像听众一样。我不想暂停程序并要求输入,然后让用户输入并按Enter键。我正在寻找的更像是:
如果用户按下W,S,A,D - >;有事情发生。
或者:如果用户在 - >中按下leftmouse按钮;事情发生了。
我必须提到我对编程整体还是一个新手。我知道基本的OOP编程,但就是这样。我绝对肯定这会涉及我还不知道的事情,我不介意,我只是要求你彻底解释它,并且可能举一个例子,所以我知道如何使用它。
感谢。
答案 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::cin
和std::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应用程序中,您可以使用用户可以键入的标准编辑控件。当您的程序在其中输入文本时,您的程序会收到消息,并根据这些消息或其他事件,您可以检索文本并根据程序的要求执行操作。