命令行窗口键盘、鼠标输入的处理方法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【 VC++ 】命令行利器—— ReadConsoleInput

2009-04-04 22:58

———————【转载请保留】———————

作者:Defanive

博客:(/Console_App)

———————【谢谢合作】———————

类型:原创

时间:09.04.04

测试环境:VC++ 6.0

本站的大部分教程,都写了对命令行的控制、输出,而很少提到获取命令行的信息。记得edit吗,它能让命令行接受键盘、鼠标的信息,宛如一个命令行版的Notepad,实在不能不让人佩服。不止edit,还有许多命令行程序都具备这个功能。而本教程,将教会你如何实现这些效果。

本教程要介绍的API函数就是ReadConsoleInput,其参数如下:

ReadConsoleInput (

HANDLE hConsoleInput,

PINPUT_RECORD lpBuffer,

DWORD nLength,

LPDWORD lpNumberOfEventsRead

)

参数详解:

HANDLE hConsoleInput:

命令行标准输入流句柄,可以通过API函数GetStdHandle获得

PINPUT_RECORD lpBuffer:

INPUT_RECORD结构体的指针。此参数用于储存读入的信息,定义在Windows.h中

DWORD nLength:

INPUT_RECORD结构体的大小

LPDWORD lpNumberOfEventsRead:

DWORD的指针。此参数用于储存读入信息的个数

示例代码:

按下A键后继续:

HANDLE hIn=GetStdHandle(STD_INPUT_HANDLE);

INPUT_RECORD keyRec;

DWORD res;

for(;;)

{

ReadConsoleInput(hIn, &keyRec, 1, &res);

if (keyRec.EventType==KEY_EVENT){

if (keyRec.Event.KeyEvent.wVirtualKeyCode==65)

{

break;

}

}

}

以上代码的65是A键的虚拟键码,键盘上其他键的虚拟键码可以在Winuser.h中的“Virtual Keys, Standard Set”部分找到。

那么,现在您对做出一个Choice已经胸有成竹了呢?您只需要稍加改动,就可以做出一个属于自己的Choice!而且,与Choice更大的不同在于,您的Choice不单单是字母选择,还可以用回车、退格、Home等做选项。

关于读取鼠标信息:

读取鼠标信息,基本步骤是不变的,只是在对信息的处理方面改变了。

示例代码:

光标跟随鼠标移动,单击左键后继续

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);

HANDLE hIn=GetStdHandle(STD_INPUT_HANDLE);

INPUT_RECORD mouseRec;

DWORD res;

for(;;)

{

ReadConsoleInput(hIn, &mouseRec, 2, &res);

SetConsoleCursorPosition(hOut,mouseRec.Event.MouseEvent.dwMousePosition);

if(mouseRec.Event.MouseEvent.dwEventFlags==0)

{

if(mouseRec.Event.MouseEvent.dwButtonState==1)

{

break;

}

}

}

如果您有认真得看读取键盘信息的代码,相信示例代码一定不难看懂。其中,

mouseRec.Event.MouseEvent.dwButtonState有3个值,1代表的是左键按下,2代表的是右键按下,4则是滚轮中键被按下。

(注意,此程序双击运行才能看到效果,在CMD中调用则没有效果,具体原因请期待下一篇文章)

那么,您现在一定对写出一个支持鼠标的第三方命令行工具有所想法了吧,也相信您对ReadConsoleInput这个API函数刮目相看了吧。

范例下载地址:

/down/defanive_3032138.html

相关文档
最新文档