Roh*_*hit 7 c++ keyboard mouse input
我想知道如何在C++中接受键盘和鼠标输入,使用Visual Studio 2010,Windows 7 32位.
--EDIT:我忘了提到我需要键盘/鼠标输入而不会中断程序的流程.像听众一样.我不想暂停程序并要求输入,然后让用户输入并按Enter键.我正在寻找的更像是:
如果用户按下W,S,A,D - >会发生一些事情.
或者:如果用户按下leftmouse按钮 - >发生了一些事情.
我必须提到,我对整个编程仍然很陌生.我知道基本的OOP编程,但就是这样.我绝对相信这会涉及我还不知道的事情,我不介意,我只是要求你彻底解释它,并可能举一个例子,所以我知道如何使用它.
谢谢.
Sof*_*ner 14
键盘/鼠标输入不会中断流程
#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;
}
Run Code Online (Sandbox Code Playgroud)
这背后有许多相关概念.
在非常低的级别,键盘和鼠标是硬件设备,它们向CPU 产生一些" 中断 "(以电信号的形式).操作系统通过解码设备通信特定协议提供一些处理这种中断的驱动程序,并以事件的形式"标准化"(在OS级别)这些信号.
使用"控制台应用程序",操作系统通过填充输入缓冲区(本质上是char [])来处理这些事件(特别是键盘),该缓冲区可以作为"几乎无限的字符序列"访问("文件的复杂名称" ")命名为"CON",因此模仿早期计算机的"无限电传模型".在C++程序中,标准库-at程序启动 - 关联到"文件" std::cin
和std::cout
流对象,因此您可以使用std::istream
函数和运算符读取输入字符序列.
遗憾的是,对于"图形应用程序",没有模仿的"早期模型",并且"事件"可用作操作系统本机结构.不同的操作系统在表示和处理这些事件的方式上有所不同,但可以看到某些相似性.对于Windows(因为您的问题是关于),典型的程序使用"消息循环"按顺序检索这些事件,其中调用某些OS API.在该循环中,典型的程序还将调用另一个OS API来将这些事件分派给与先前创建的"窗口"相关联的适当的"回调"过程.该回调过程必须检测事件代码,适当地转换参数并管理它们执行所需的操作.
使用WIN32编程教程(如http://www.winprog.org/tutorial/)可以看到更精确的细节.大多数代码基本上都是C,因为C是API正式化的语言.对于C++,已经编写了许多库来表示OS对象是C++类的形式,并将OS API映射到这些类成员.这些库可以是特定于操作系统(如MFC,WTL ......)或"多平台"(它们存在于不同版本中,将各种操作系统的API映射到相同的C++接口),如WxWidget,Qt,Gtk,Fltk. ..
希望这可以给你更多提示思考.