版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Windows应用程序中的键盘与鼠标
1
扫描码是依赖于具体设备的,为达到设备无关性的要求,往往使用与具体设备无关的虚拟码,虚拟码是由Windows系统定义的与设备无关的键的标识由于键盘的输入产生一条消息扫描码、虚拟码以及其他与击键有关的消息设备驱动程序截取键的扫描码翻译虚拟码它含键盘上的键对应一个唯一的标识值(扫描码)按下或释放某键时产生取出键盘消息进行处理消息设备驱动程序把消息放到系统的消息队列中Windows从系统消息队列中取出消息发送到相应的线程消息队列中窗口过程扫描码是依赖于具体设备的,为达到设备无关性的要求2
虚拟码是一种与设备无关的键盘编码,它的值存放在键盘消息的wParam参数中,用以标识哪一个键被按下或释放,最常用的虚拟码已经在Windows.h中定义,虚拟码是一种与设备无关的键盘编码,它的值存放3键盘消息按键消息字符消息按下或松开一个键时就产生了一按键消息一个按键的组合产生了一个可以显示的字符时,就产生了一个字符消息系统按键消息非系统按键消息Alt键与相关输入键的组合产生的消息,这些键一般由Windows系统内部直接处理,应用程序不处理若应用程序处理了这些系统键消息,还要调用DefWindowsProc()函数,以便不影响系统对它们的处理不使用Alt键组合的的按键消息键盘消息按键消息字符消息按下或松开一个键时一个按键的组合产生4按键消息的两个变量wParamlParam32位的变量重复计数位(0~15位)OEM扫描码(16~23位)扩展键标志(24位)保留位(25~28位)关联码(29位)键的先前状态(位30)转换状态(31位)包含了识别按下的键的虚键码按键消息的两个变量wParamlParam32位的变量重复计5WM_KEYDOWN
wParam
Specifiesthevirtual-keycodeofthenonsystemkey.lParam0-15Specifiestherepeatcountforthecurrentmessage.Thevalueisthenumberoftimesthekeystrokeisautorepeatedasaresultoftheuserholdingdownthekey.Ifthekeystrokeisheldlongenough,multiplemessagesaresent.However,therepeatcountisnotcumulative.16-23Specifiesthescancode.ThevaluedependsontheOEM.24Specifieswhetherthekeyisanextendedkey,suchastheright-handALTandCTRLkeysthatappearonanenhanced101-or102-keykeyboard.Thevalueis1ifitisanextendedkey;otherwise,itis0.25-28Reserved;donotuse.29Specifiesthecontextcode.Thevalueisalways0foraWM_KEYDOWNmessage.30Specifiesthepreviouskeystate.Thevalueis1ifthekeyisdownbeforethemessageissent,oritiszeroifthekeyisup.31Specifiesthetransitionstate.ThevalueisalwayszeroforaWM_KEYDOWNWM_KEYDOWN6在WinMain函数的消息循环中包含了TranslateMessage函数,其功能是把按键消息转化为字符消息,但只有当键盘驱动程序把键盘字符映射成ASCII码后才能产生WM_CHAR消息字符消息系统非系统WM_KEYDOWN和WM_KEYUP的按键消息只能产生非系统消息WM_SYSKEYDOWN和WM_SYSKEYUP按键消息只能产生系统消息在WinMain函数的消息循环中包含了Tra7WM_CHAR
wParam
Specifiesthecharactercodeofthekey.lParam0-15Specifiestherepeatcountforthecurrentmessage.Thevalueisthenumberoftimesthekeystrokeisautorepeatedasaresultoftheuserholdingdownthekey.Ifthekeystrokeisheldlongenough,multiplemessagesaresent.However,therepeatcountisnotcumulative.16-23Specifiesthescancode.ThevaluedependsontheOEM.24Specifieswhetherthekeyisanextendedkey,suchastheright-handALTandCTRLkeysthatappearonanenhanced101-or102-keykeyboard.Thevalueis1ifitisanextendedkey;otherwise,itis0.25-28Reserved;donotuse.29Specifiesthecontextcode.Thevalueis1iftheALTkeyishelddownwhilethekeyispressed;otherwise,thevalueis0.30Specifiesthepreviouskeystate.Thevalueis1ifthekeyisdownbeforethemessageissent,oritiszeroifthekeyisup.31Specifiesthetransitionstate.Thevalueis1ifthekeyisbeingreleased,oritis0ifthekeyisbeingpressed.WM_CHAR8【例】设计一个窗口,在该窗口中练习键盘的响应,要求如下:(1)
单击键盘上的pageup箭头时,显示“Youhadhittedthepageupkey”(2)
单击<Shift>键时,窗口中显示“YouhadhittedtheSHIFTkey”(3)
单击<Ctrl>键时,窗口中显示“YouhadhittedtheCTRLkey”(4)
单击<Ctrl+A>键时,窗口中显示“YouhadhittedtheCTRLAkey”(5)
单击<Shift+B>键时,窗口中显示“YouhadhittedtheSHIFTBkey”【例】设计一个窗口,在该窗口中练习键盘的响应,要求如下:9//以下定义输出的字符串。staticcharcUp[]="YouhadhittedtheUPkey";staticcharcCtrl[]="YouhadhittedtheCtrlkey";staticcharcShift[]="YouhadhittedtheSHIFTkey";staticcharcCtrl_A[]="YouhadhittedtheCTRLAkey";staticcharcShift_B[]="YouhadhittedtheSHIFTBkey";//下面定义并初始化按键标志变量。staticBOOLnUpKeyDown=FALSE, nShiftKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE, nShiftBKeyDown=FALSE;//以下定义输出的字符串。//下面定义并初始化按键标志变量。10voidCMy20080926Dlg::OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags){ //TODO:Addyourmessagehandlercodehereand/orcalldefault switch(nChar){ caseVK_UP: //当按上箭头键时,变量置为真。 nUpKeyDown=TRUE; break; caseVK_SHIFT: //当按shift键时,变量置为真。 nShiftKeyDown=TRUE; break; caseVK_CONTROL: //当按control键时,变量置为真 nCtrlKeyDown=TRUE; break; case'B': if(nShiftKeyDown) nShiftBKeyDown=TRUE; break; case'A': if(nCtrlKeyDown) nCtrlAKeyDown=TRUE; break; default: break; }
CDialog::OnKeyDown(nChar,nRepCnt,nFlags);}voidCMy20080926Dlg::OnKeyDown11 CPaintDCdc(this); if(nUpKeyDown==TRUE) { dc.Rectangle(0,0,300,200); dc.TextOut(0,0,cUp,strlen(cUp)); nUpKeyDown=FALSE; } elseif(nCtrlAKeyDown==TRUE) { dc.Rectangle(0,0,300,200); dc.TextOut(0,100,cCtrl_A,strlen(cCtrl_A)); nCtrlAKeyDown=FALSE; nCtrlKeyDown=FALSE; } elseif(nCtrlKeyDown==TRUE&&nCtrlAKeyDown==FALSE) { dc.Rectangle(0,0,300,200); dc.TextOut(0,60,cCtrl,strlen(cCtrl)); nCtrlKeyDown=FALSE; } elseif(nShiftBKeyDown==TRUE) { dc.Rectangle(0,0,300,200); dc.TextOut(0,0,cShift_B,strlen(cShift_B)); nShiftBKeyDown=FALSE; nShiftKeyDown=FALSE; } elseif(nShiftBKeyDown==FALSE&&nShiftKeyDown==TRUE) { dc.Rectangle(0,0,300,200); dc.TextOut(0,0,cShift,strlen(cShift)); nShiftKeyDown=FALSE; } CPaintDCdc(this);12BOOLCMy20080926Dlg::PreTranslateMessage(MSG*pMsg){ //TODO:Addyourspecializedcodehereand/orcallthebaseclass if(pMsg->message==WM_KEYDOWN){ if(pMsg->wParam==VK_UP) nUpKeyDown=TRUE; } returnCDialog::PreTranslateMessage(pMsg);}BOOLCMy20080926Dlg::PreTransl13鼠标在应用程序中的应用鼠标作为定位输入设备,通过鼠标单击、双击和拖动功能,用户可以很容易地操作基于Windows图形界面的应用程序。Windows中通过光标来指示当前鼠标的位置,在Windows操作系统中预定义了几种光标,并在Windows.h头文件中加以定义,鼠标在应用程序中的应用鼠标作为定位输入设备,通过鼠标单击、双14例如,下面的语句为窗口类wndclassWNDCLASSwndclass;…wndclass.hCursor=LoadCursor(hThislnst,IDC_WAIT);…此外,还可在应用程序中调用LoadCursor函数改变光标形式用户自定义光标自定义光标保存在扩展名为.cur的文件中
光标名CURSOR光标文件(.cur)采用自定义光标时,需在资源文件中定义光标资源加载光标资源(常在定义窗口类时进行)
LoadCursor(hThisInst,lpszCursorname)当前实例句柄当前光标例如,下面的语句为窗口类wndclass用户自定义光标采用自15鼠标消息lParam包含了鼠标位置低位包含鼠标位置的x坐标值高位包含鼠标位置的y坐标wParam包含了指示各种虚键状态的值相当于窗口的左上角为原点的坐标值鼠标消息lParam包含了鼠标位置低位包含鼠标位置的x坐标值16对于鼠标消息的处理要对Shift和Ctrl键进行监测caseWM_LBUTTONDOWN://按下鼠标左键if((wParam&MK_CONTROL)&&(wParam&MK_SHIFT))… //Shift和Ctrl键都被按下break;caseWM_LBUTTONUP: //释放鼠标左键…break;…caseWM_LBUTTONDOWN://按下鼠标左键… break;caseWM_LBUTTONUP: //释放鼠标左键…break;…不监测对于鼠标消息的处理要对Shift和Ctrl键进行监测case17Windows系统默认的时间间隔为0.5秒,也可以调用SetDoubleClickTime()重新设定间隔值若窗口不包含上述属性的定义,即使进行了双击操作,该窗口也只能接收到两条WM_BUTTONDOWN消息或两条WN_BUTTONUP消息。鼠标双击wndclass.style=CS_HEADRAW|CS_VERDRAW|CS_DBLCLKS;要使窗口函数能接收鼠标双击产生的消息在注册窗口类时必须具有CS_DBLCLKS属性Windows系统默认的时间间隔为0.5秒,也可以调用Set18鼠标应用程序实例【例】鼠标输入示范程序,本例介绍如何响应鼠标信息、并改变光标形状等用法,用户在窗口的不同区域移动鼠标时,光标将显示如下图所标识的不同箭头的形状鼠标应用程序实例【例】鼠标输入示范程序,本例介绍如何响应鼠标19 hcursor=AfxGetApp()->LoadCursor(I
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 办公设备维护保养协议2026
- 2026年银行网点安全管理与服务标杆网点创建经验
- 2026年高血压防治健康教育处方
- 跨境电商平台产品售后服务协议
- 2025年工业物联网数字孪生模型验证方法
- 工伤保险理赔服务条款补充协议
- 2026年养老机构财务管理与成本控制
- 庆典活动策划服务合同2026年执行细则
- 法律事务合同纠纷调解与和解服务协议
- 2026年护理专业护士执业资格证注册流程
- 肝癌的超声诊断
- 5年(2021-2025)重庆高考地理真题分类汇编专题14 资源、环境与国家安全(原卷版)
- 2025年铁路公司招聘考试(计算机专业知识)经典试题及答案
- 废气处理设计计算书(完整版)
- 杀虫剂知识培训课件
- 干熄焦安全培训课件
- 数据中心液冷施工方案
- 路面坑洼修复方案
- 股权转让交割清单
- 瑞幸AI面试题库及答案
- 运维培训知识课件
评论
0/150
提交评论