命令行窗口键盘、鼠标输入的处理方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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