MFC 组合键的实现

    技术2023-03-19  27

      VC响应键盘事件(组合键) 收藏 如何在vc中添加键盘响应事件

    1.         ClassView中Add Windows Message Handle 添加WM-KEYDOWN和WM-KEYUP,Add Virtural Functions添加PreTranslateMessage

    2.         BOOL **Dlg::PreTranslateMessage(MSG* pMsg)中添加

           if (pMsg-> message == WM_KEYDOWN)

                  {

                         if(pMsg-> wParam== VK_RETURN)//直接用虚码代替就可以响应所指键

                         SetInfo(WDK_OK);      //回车对应ok

                  }

           if (pMsg-> message == WM_KEYDOWN)

                  {

                         if(pMsg-> wParam== VK_BACK)//直接用虚码代替就可以响应所指键

                         SetInfo(WDK_C);         //backspace对应删除

                  }

           return CDialog::PreTranslateMessage(pMsg);

    }

    3.         虚拟值

    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键

    VK_INSERT                2D INS 键

    VK_DELETE              2E DEL 键

    VK_HELP                   2F   HELP键

    对于非小键盘上的数字键和字母键,直接在单引号中加入该键就行

    比如: a 键: 'A'

    1 键: '1'

    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                      7E 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 键

    4.         组合键的用法:(本例响应Ctrl+X键)

    BOOL CMydilog::PreTranslateMessage(MSG* pMsg)

    {

    if (pMsg-> message == WM_KEYDOWN)

    {

    switch (pMsg-> wParam)

    {

    case VK_ESCAPE:

    SetFocus ();

    return TRUE;

    case 'X':

    if(::GetKeyState(VK_CONTROL) < 0)

    MessageBox(" hello" );

    return TRUE;

    }

    }

    return CDialog::PreTranslateMessage(pMsg);

    }

     

    ==============================================================================

     

    网上很多人问组合键的处理,例如要同时按上ctrl+某个键的响应,不过网上很多文章没讲清楚具体要如何做,只是说了用GetAsyncKeyState等函数,在普通的windows程序中,的确可以用这个函数再加上一些消息响应来判断,不过在mfc中就另一回事了。        MFC中,一般在WM_KEYUP或WM_KEYDOWN中,普通的按键可以实现组合,但ctrl,shirt这些却不能,这个是什么原因,我自己也不清楚。但解决的方法如下:        可以在mainframe等类中重载pretranslatemessage函数,然后这样实现:

    BOOL CMainFrame::PreTranslateMessage(MSG* pMsg){    // TODO: Add your specialized code here and/or call the base class    char nChar = pMsg->wParam;    if(nChar == 'Z' && ((GetAsyncKeyState( VK_LCONTROL ) & 0x8000)))    {        AfxMessageBox("ctrl + z");    }   return CFrameWndEx::PreTranslateMessage(pMsg);

    }

    最新回复(0)