MFC键盘响应消息

来源:互联网 发布:java web ftp下载文件 编辑:程序博客网 时间:2024/03/29 14:07
MFC 键盘响应

一:首先介绍键盘消息
系统消息:
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 08BACKSPACE 键
VK_TAB 09TAB 键
VK_CLEAR 0CCLEAR 键
VK_RETURN 0D ENTER 键
VK_SHIFT 10SHIFT 键
VK_CONTROL 11 CTRL 键
VK_MENU 12ALT 键
VK_PAUSE 13PAUSE 键
VK_CAPITAL 14 CAPS LOCK 键
VK_ESCAPE 1B ESC 键
VK_SPACE   20 SPACEBAR
VK_PRIOR   21PAGE UP 键
VK_NEXT 22PAGE DOWN 键
VK_END 23END 键
VK_HOME 24HOME 键
VK_LEFT 25LEFT ARROW 键
VK_UP 26UP ARROW 键
VK_RIGHT 27RIGHT ARROW 键
VK_DOWN 28DOWN 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 2FHELP键

VK_LWIN 5BLeft Windows 键 (Microsoft自然键盘)
VK_RWIN   5CRight Windows 键 (Microsoft自然键盘)
VK_APPS   5DApplications 键 (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 6BAdd键
VK_SEPARATOR 6C Separator 键
VK_SUBTRACT   6D Subtract 键
VK_DECIMAL   6E Decimal 键
VK_DIVIDE 6FDivide 键
VK_F1 70F1 键
VK_F2 71F2 键
VK_F3 72F3 键
VK_F4 73F4 键
VK_F5 74F5 键
VK_F6 75F6 键
VK_F7 76F7 键
VK_F8 77F8 键
VK_F9 78F9 键
VK_F10 79F10 键
VK_F11 7AF11 键
VK_F12 7BF12 键
VK_F13 7CF13 键
VK_F14 7DF14 键
VK_F15 7 EF15 键
VK_F16 7FF16 键
VK_F17 80HF17 键
VK_F18 81HF18 键
VK_F19 82HF19 键
VK_F20 83H F20 键
VK_F21 84H F21 键
VK_F22 85HF22 键
VK_F23 86H F23 键
VK_F24   87HF24 键
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,虚拟键码可以下面相关资料中查到)。

原创粉丝点击