键盘消息处理

 PreTranslateMessage

MFC中PreTranslateMessage是GetMessage(...)函数的下一级操作,即GetMessage(...)从消息队列中获取消息后,交由PreTranslateMessage()处理,若其返回FALSE则再交给TranslateMessage和DispatchMessage处理(进入WindowProc);  
如果用SendMessage,   则消息直接交到WindowProc处理,所以GetMessage不会取得SendMessage的消息,当然PreTranslateMessage也就不会被调用。  
如果用PostMessage,则消息进入消息队列,由GetMessage取得,PreTranslateMessage就有机会进行处理

    传给PreTranslateMessage()的消息是未经翻译过的消息,它没有经过TranslateMessage()处理。可以在该函数中使用(pMsg->wParam==VK_RETURN)来拦截回车键。wParam中存放的是键盘上字符的虚拟码。  

BOOL CMDIView::PreTranslateMessage( MSG* pMsg)
{
  
 	if ( pMsg->wParam == VK_F1)//进入全屏
 	{

  		(( CMainFrame*)::AfxGetMainWnd())->EnterFullScreen();//调用主框架里的函数    

  
  		return TRUE;
 	}
 	if ( pMsg->wParam == VK_F2)//退出全屏
 	{

  		(( CMainFrame*)::AfxGetMainWnd())->QuitFullScreen();//调用主框架里的函数    

  
 	 return TRUE;
 	}

 	return CView ::PreTranslateMessage( pMsg);
}



 

01. PreTranslateMessage函数,常用于屏蔽MFC对话框中默认的Enter和ESC消息

函数原型:BOOL PreTranslateMessage(MSG* pMsg)

用法举例:

BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) 
{
    if(pMsg->message == WM_KEYDOWN){
        if(pMsg->wParam == VK_ESCAPE){
            return TRUE;
        }
        if(pMsg->wParam == VK_RETURN){
            return TRUE; // 对话框内部控件不可以接收到回车消息!! 
        }
    }

    return CDialog::PreTranslateMessage(pMsg);
}

02.if(pMsg->message==WM_SYSKEYDOWN)
{
   if(pMsg->wParam==VK_MENU)
    MessageBox("alt");
}


if((pMsg->wParam==VK_F9) && (GetAsyncKeyState(VK_MENU)<0))
{   
   MessageBox(_T("同时按下了Alt键和F9键"));   
}


GetAsyncKeyState()
=========================
功能:确定用户当前是否按下了键盘上的一个键
原型:SHORT GetAsyncKeyState(int vKey);

参数:nVirtKey指出要检查键的虚键代码。结果的高位指出该键当前是否被按下(是为1,否为0)。
常用键的VK值:
VK_SHIFT Shift键
VK_LSHIFT 左Shift键
VK_RSHIFT 右Shift键
VK_CONTROL Ctrl键
VK_LCONTROL 左Ctrl键
VK_RCONTROL 右Ctril键
VK_MENU Alt键
VK_LMENU 左Alt键
VK_RMENU 右Alt键
VK_LBUTTON 鼠标左键
VK_RBUTTON 鼠标右键

另一个函数GetKeyState与GetAsyncKeyState函数不同。GetAsyncKeyState在按下某键的同时调用,判断正在按下某键。
GetKeyState则在按过某键之后再调用,它返回最近的键盘消息从线程的队列中移出时的键盘状态,判断刚按过了某键。

与RegisterHotKey()相比,GetAsyncKeyState()的优点在于可以监控鼠标按键,缺点是需要使用定时器。

BOOL CCtrl::PreTranslateMessage(MSG* pMsg)
{
   // TODO: 在此添加专用代码和/或调用基类
      switch(pMsg->message)
      {
      case WM_KEYDOWN:
        {    
           switch(pMsg->wParam)
           {
           case VK_DOWN:
           case VK_UP:
              {   m_Viewer->getEventQueue()->keyPress((osgGA::GUIEventAdapter::KeySymbol)pMsg->wParam);
                    break;
              }
           default:
              break;
           }
           break;
        }
      default:
        break;
      }
   
      return COleControl::PreTranslateMessage(pMsg);
}


OnKeyDown

void CMDIView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // Pass Key Presses into OSG
    mOSG->getViewer()->getEventQueue()->keyPress(nChar);
    switch(nChar)  
    {  
    case VK_ESCAPE:  
        {
            GetParent()->SendMessage(WM_CLOSE);
        break;
        }   
    case 'F':  //全屏控制
        {  
            ((CMainFrame*)::AfxGetMainWnd())->OnFullscreen();
            break;  
        }  

    }    
}
-----------------------------------------------------------------------------------------------------------------

经常使用的虚拟码在WINDOWS.H文件中定义,常用虚拟码的数值、常量符号和含义如表所示。

取值(16进制) 常量符号 含义
01 VK_LBUTTON 鼠标左键
02 VK_RBUTTON 鼠标右键
03 VK_CANCEL Break中断键
04 VK_MBUTTON 鼠标中键
05-07 -- 未定义
08 VK_BACK (BackSpace)键
09 VK_TAB Tab键
0A-0B -- 未定义
0C VK_CLEAR Clear键
0D VK_RETURN Enter键
0E-0F -- 未定义
10 VK_SHIFT Shift键
11 VK_CONTROL Ctrl键
12 VK_MENU Alt键
13 VK_PAUSE Pause键
14 VK_CAPTIAL CapsLock键
15-19 -- 汉字系统保留
1A -- 未定义
1B VK_ESCAPE Esc键
1C-1F -- 汉字系统保留
20 VK_SPACE 空格键
21 VK_PRIOR PageUp键
22 VK_NEXT PageDown键
23 VK_END End键
24 VK_HOME Home键
25 VK_LEFT ←(Left Arrow)键
26 VK_UP ↑(Up Arrow)键
27 VK_RIGHT →(Right Arrow)键
28 VK_DOWN ↓(Down Arrow)键
29 VK_SELECT Select键
2A -- OEM保留
2B VK_EXECUTE Execute键
2C VK_SNAPSHOT Print Screen键
2D VK_INSERT Insert键
2E VK_DELETE Delete键
2F VK_HELP Help键
30-39 VK_0-VK_9 数字键0-9
3A-40 -- 未定义
41-5A VK_A-VK_Z 字母键A-Z
5B-5F -- 未定义
60-69 VK_NUMPAD0-VK_NUMPAD9 小键盘数字键0-9
6A VK_MULTIPLY *(乘号)键
6B VK_ADD +(加号)键
6C VK_SEPAPATOR 分隔符键
6E VK_SUBTRACT -(减号)键
6F VK_DECIMAL .(小数点)键
70-87 VK_DIVIDE /(除号)键
88-8F VK_F1-VK_F24 F1-F24功能键
90 VK_NUMBERLOCK Number lock键
91 VK_SCROLL Scroll lock键
92-B9 -- 未定义
BA-C0 -- OEM保留
C1-DA -- 未定义
DB_E4 -- OEM保留
E5 -- 未定义
E6 -- OEM保留
E7-E8 -- 未定义
E9-F5 -- OEM保留
F6-FE -- 未定义


你可能感兴趣的:(键盘消息处理)