2014-04-08 2 views
0

MFC의 PretranslateMsg에서 키보드 메시지를 사전 처리하려고합니다. 그래서 다음 코드를 작성합니다.MFC의 PretranslateMsg에서 "Alt + num"으로 바로 가기 키를 가져 오지 못하셨습니까?

if(pMsg->message == WM_KEYUP) 
     { 
      if(GetKeyState(VK_CONTROL) || GetKeyState(VK_SHIFT) || GetKeyState(VK_MENU)) 
      { 
       CString csKey = TranslateKeyToString(GetKeyState(VK_CONTROL) & 0x8000 ,GetKeyState(VK_SHIFT) & 0x8000, GetKeyState(VK_MENU)&0x8000, pMsg->wParam); 
       DoWorkForAcceleratorKey(csKey); 
       return TRUE; 
      } 
     } 

위의 코드를 사용하십시오. 나는 "Ctrl + Alt + 1"과 "Ctrl + 1"에 대해 "csKey"에서 shotcut을 얻을 수 있지만 Alt + 1을 누르면 "Alt + 1"을 얻을 수 없습니다. csKey는 이상한 단일 문자입니다. "Alt + 1"의 경우 어떻게됩니까?이 문제를 해결하는 방법은 무엇입니까? 감사합니다.

+0

중단 점을 TranslateKeyToString 안에 넣고 인수를 확인하십시오. – rmi

+0

'Alt + '은 보통 주 메뉴를 탐색하는 데 사용되기 때문에 약간 특이한 것이므로'PreTranslateMsg'에 도달하기 전에 필터링되는 것을 발견 할 수 있습니다. – user1793036

답변

2

에 대한 WM_KEYUP 메시지가 표시되지 않습니다. Alt 키를 사용하면 입력 한 문자가 다른 방식으로 사용됩니다.

WM_KEYUP 대신 WM_SYSKEYUP을 수신합니다. 받은 WM_KEYUP에는 nVirtKey 코드 VK_MENU가 있어야합니다. 내가 메모장에서 ALT + 1를 누를 때 이것은

은 ++ 스파이에 의해 캡처 된 메시지입니다.

WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:0 fAltDown:1 fRepeat:0 fUp:0 
WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:0 fAltDown:1 fRepeat:1 fUp:0 
WM_SYSKEYDOWN nVirtKey:'1' cRepeat:1 ScanCode:02 fExtended:0 fAltDown:1 fRepeat:0 fUp:0 
WM_SYSCHAR chCharCode:'49' (49) cRepeat:1 ScanCode:02 fExtended:0 fAltDown:1 fRepeat:0 fUp:0 
WM_SYSKEYUP nVirtKey:'1' cRepeat:1 ScanCode:02 fExtended:0 fAltDown:1 fRepeat:1 fUp:1 
WM_KEYUP nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:0 fAltDown:0 fRepeat:1 fUp:1 
WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:0 fAltDown:1 fRepeat:0 fUp:0 
관련 문제