2014-10-07 89 views
0

我想要捕獲在C++中使用preTranslateMessage()的鍵組合,如ALT+CTRL+INSERT,如下面的代碼所示。我無法得到我所期待的。我試着做邏輯代碼更改。
它似乎並不是最好的解決方案。另外,使用鍵盤加速器可能會解決我的問題。但我無法準確弄清楚如何執行過程。如何在C++中使用preTranslate消息捕獲組合鍵ALT + CTRL + INSERT

請人給我建議一些可能的解決方案..

BOOL BMWView::PreTranslateMessage(MSG* pMsg) 
{ 
    //static int k_ctrlPressed,k_altPressed,k_insertPressed = 0; 
     static int keylog_var = 0; 
    if (pMsg->message == WM_KEYUP) 
    { 
     switch (pMsg->wParam) 
     { 

      case VK_CONTROL: if(keylog_var==0) keylog_var = 1; else keylog_var = 0; 
       break; 
      case VK_MENU: if(keylog_var==1) keylog_var = 2; else keylog_var = 0; 
       break; 
      case VK_INSERT: if(keylog_var==2) keylog_var = 3; else keylog_var = 0; 
       break; 
      default: keylog_var = 0;   
       break; 
     } 
    //Switch case is replaced with below if statement 

    if(keylog_var == 3) 
    { 
     keylog_var = 0; 
     // Set mode 
     CWnd *pWnd = (CWnd *)this; 
     pWnd->PostMessage(ID_ENTRY, 0L, 0L); 
    } 

    } 
    return BView::PreTranslateMessage(pMsg); 
+0

使用加速器確實是最乾淨的解決方案。你應該這樣做。 – 2014-10-07 11:02:33

回答

0

簡單。使用GetKeyState捕獲ALT+CTRL+INSERT,並通過測試pMsg獲取VK_INSERT

BOOL CTestView::PreTranslateMessage(MSG* pMsg) 
{ 
    if(pMsg->message==WM_KEYDOWN) 
    { 
    BOOL bCtrl=::GetKeyState(VK_CONTROL)&0x8000; 
    BOOL bShift=::GetKeyState(VK_SHIFT)&0x8000; 
    BOOL bAlt=::GetKeyState(VK_MENU)&0x8000; 

    switch(pMsg->wParam) 
    { 
     case VK_INSERT : 
     if(bCtrl && bAlt)  
     { 
      MessageBox(" Ctrl+Alt+INSERT ", " ",MB_OK); 
     } 

     break; 

    } 
    } 
    return CView::PreTranslateMessage(pMsg); 
}