您的位置:首页 > 其它

MFC 键盘响应

2015-09-07 19:25 453 查看
一:首先介绍键盘消息

系统消息:

ALT,F1,——F24等,是由系统内部处理的,程序本身就存在,比如F1是帮助键。

WM_SYSKEYDOWN

WM_SYSKEYUP

WM_SYSCHAR

非系统消息:

是由我们自己加上去的,

WM_KEYDOWN

WM_KEYUP

WM_CHAR

二:然后介绍虚拟键代码

符号形式 十六进制形式 说明

VK_LBUTTON 01 鼠标左键

VK_RBUTTON 02 鼠标右键

VK_CANCEL 03 Control-break 过程

VK_MBUTTON 04 鼠标中键

VK_BACK 08 BACKSPACE 键

VK_TAB 09 TAB 键

VK_CLEAR 0C CLEAR 键

VK_RETURN 0D ENTER 键

VK_SHIFT 10 SHIFT 键

VK_CONTROL 11 CTRL 键

VK_MENU 12 ALT 键

VK_PAUSE 13 PAUSE 键

VK_CAPITAL 14 CAPS LOCK 键

VK_ESCAPE 1B ESC 键

VK_SPACE 20 SPACEBAR

VK_PRIOR 21 PAGE UP 键

VK_NEXT 22 PAGE DOWN 键

VK_END 23 END 键

VK_HOME 24 HOME 键

VK_LEFT 25 LEFT ARROW 键

VK_UP 26 UP ARROW 键

VK_RIGHT 27 RIGHT ARROW 键

VK_DOWN 28 DOWN ARROW 键

VK_SELECT 29 SELECT 键

VK_EXECUTE 2B EXECUTE 键

VK_SNAPSHOT 2C PRINT SCREEN键(用于Windows 3.0及以后版本)

VK_INSERT 2D INS 键

VK_DELETE 2E DEL 键

VK_HELP 2F HELP键

VK_LWIN 5B Left Windows 键 (Microsoft自然键盘)

VK_RWIN 5C Right Windows 键 (Microsoft自然键盘)

VK_APPS 5D Applications 键 (Microsoft自然键盘)

VK_NUMPAD0 60 数字小键盘上的 0 键

VK_NUMPAD1 61 数字小键盘上的 1 键

VK_NUMPAD2 62 数字小键盘上的 2 键

VK_NUMPAD3 63 数字小键盘上的 3 键

VK_NUMPAD4 64 数字小键盘上的 4 键

VK_NUMPAD5 65 数字小键盘上的 5 键

VK_NUMPAD6 66 数字小键盘上的 6 键

VK_NUMPAD7 67 数字小键盘上的 7 键

VK_NUMPAD8 68 数字小键盘上的 8 键

VK_NUMPAD9 69 数字小键盘上的 9 键

VK_MULTIPLY 6A Multiply 键

VK_ADD 6B Add键

VK_SEPARATOR 6C Separator 键

VK_SUBTRACT 6D Subtract 键

VK_DECIMAL 6E Decimal 键

VK_DIVIDE 6F Divide 键

VK_F1 70 F1 键

VK_F2 71 F2 键

VK_F3 72 F3 键

VK_F4 73 F4 键

VK_F5 74 F5 键

VK_F6 75 F6 键

VK_F7 76 F7 键

VK_F8 77 F8 键

VK_F9 78 F9 键

VK_F10 79 F10 键

VK_F11 7A F11 键

VK_F12 7B F12 键

VK_F13 7C F13 键

VK_F14 7D F14 键

VK_F15 7 E F15 键

VK_F16 7F F16 键

VK_F17 80H F17 键

VK_F18 81H F18 键

VK_F19 82H F19 键

VK_F20 83H F20 键

VK_F21 84H F21 键

VK_F22 85H F22 键

VK_F23 86H F23 键

VK_F24 87H F24 键

VK_NUMLOCK 90 NUM LOCK 键

VK_SCROLL 91 SCROLL LOCK 键

VK_ATTN F6 Attn 键

VK_CRSEL F7 CrSel 键

VK_EXSEL F8 ExSel 键

VK_EREOF F9 Erase EOF 键

VK_PLAY FA Play 键

VK_ZOOM FB Zoom 键

VK_OEM_CLEAR FE Clear 键

三:OnKeyDown不响应的原因:

只是这个消息在到达窗体之前,已经被它的子控件捕获了,如果将窗体中的所有控件都删除,窗体就会捕获到这个消息,但要注意的是,MFC为了实现在窗体上切换子控件的焦点,已经将 VK_TAB,VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN进行了处理,同时VK_RETURN也被系统捕获用来处理相应的确定事件,所以即使窗体中没控件,这几个键还是无法捕获

也就是说,一个窗体仅在它没有可视和有效的控件时,才能响应OnKeyDown。

四:具体的解决方法(按键响应方法

可以调用窗体的PreTranslateMessage函数来实现,具体代码如下:

BOOL CMeetingDlg::PreTranslateMessage(MSG* pMsg)

{

if (pMsg->message==WM_KEYDOWN)

{

switch (pMsg->wParam)

{

case VK_F1:

if (::GetKeyState(VK_CONTROL)<0)

{

AfxMessageBox("ss");

}

break;

case VK_F2:

if (::GetKeyState(VK_CONTROL)<0)

{

AfxMessageBox("ss");

}

break;

}

}

return CDialog::PreTranslateMessage(pMsg);

}

***********************************************************************************

在MFC(Microsoft Foundation Class)对响应消息进行了封装,

可以通过重载虚函数PreTranslateMessage()对所关心的消息进行截取与响应:

以下对截取与响应键盘 Enter 消息的截取与响应

这是对话框的响应键盘 Enter 消息方式:

BOOL C**Dlg::PreTranslateMessage(MSG* pMsg)

{

//判断是否为键盘消息

if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST)

{

//判断是否按下键盘Enter键

if(pMsg->wParam==VK_RETURN)

{

return TRUE;

}

}

return CDialog::PreTranslateMessage(pMsg);

}

这是View视图类响应键盘 Enter 消息的方式:

BOOL C**View::PreTranslateMessage(MSG* pMsg)

{

 if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST)

 {

  if(pMsg->wParam==VK_RETURN )

  {

return TRUE;

}

 }

 return CFormView::PreTranslateMessage(pMsg);

}

  在上面的代码中,首先将pMsg->message所表示的消息同WM_KEYFIRST 和WM_KEYLAST比较,确定是键盘消息,然后通过消息参数pMsg->wParam的值来判断是否是回车键(VK_RETURN,虚拟键码可以下面相关资料中查到)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: