在OnKeyDown()中,除了上、下、左、右键,其它键都响应,怎么回事,帮我解决一下。

解决方案 »

  1.   

    用PreTranslateMessage(MSG *pMsg)
    {
       if(pMsg->message == WM_KEYDOWN)
    {
        
    }
    }
      

  2.   

    void CStockMinuteWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    switch(nChar)
    {
    case VK_LEFT:
    {
        if((GetKeyState(VK_CONTROL) & 0xFF00) != 0)
        {
    AfxMessageBox("VK_LEFT+CTRL");
        }else
        {
    AfxMessageBox("VK_LEFT");
    }
    }
    break;
    case VK_RIGHT:
    {
    if((GetKeyState(VK_CONTROL) & 0xFF00) != 0)
    {
       AfxMessageBox("VK_RIGHT+CTRL");
    }else
    {
        AfxMessageBox("VK_RIGHT"); 
    }
    }
    break;
    case VK_UP:
    {
    if((GetKeyState(VK_CONTROL) & 0xFF00) != 0)
    {
                                         AfxMessageBox("CTRL+VK_UP"); 
    }else
    {
    AfxMessageBox("VK_UP");
    }
    }
    break;
    case VK_DOWN:
    {
    if((GetKeyState(VK_CONTROL) & 0xFF00) !=0)
    {
    AfxMessageBox("VK_DOWN+CTRL");
    }else
    {
    AfxMessageBox("VK_DOWN");
    }
    }
    break;
    case VK_ESCAPE:
    {
    //退出十字光标
                ;
    }
    break;
    default:
    break;
    } CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
    }
      

  3.   

    用PreTranslateMessage(MSG *pMsg)
    {
       if(pMsg->message == WM_KEYDOWN) {}
    {
        
      

  4.   

    因为方向键会使焦点改变,自然进不了你的keydown了。在父窗口用
    CParent::PreTranslateMessage(MSG *pMsg)
    {
       if(pMsg->message == WM_KEYDOWN)
       {
        
       }
    }
      

  5.   

    BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if(pMsg->message == WM_KEYDOWN)
    {
    AfxMessageBox("ddd");
    UINT nChar = pMsg->wParam;

    switch(nChar)
    {
    case VK_LEFT:
    {
    if((GetKeyState(VK_CONTROL) & 0xFF00) != 0)
    {
    AfxMessageBox("VK_LEFT+CTRL");
    }else
    {
    AfxMessageBox("VK_LEFT");
    }
    }
    break;
    case VK_RIGHT:
    {
    if((GetKeyState(VK_CONTROL) & 0xFF00) != 0)
    {
    AfxMessageBox("VK_RIGHT+CTRL");
    }else
    {
    AfxMessageBox("VK_RIGHT"); 
    }
    }
    break;
    case VK_UP:
    {
    if((GetKeyState(VK_CONTROL) & 0xFF00) != 0)
    {
    AfxMessageBox("CTRL+VK_UP"); 
    }else
    {
    AfxMessageBox("VK_UP");
    }
    }
    break;
    case VK_DOWN:
    {
    if((GetKeyState(VK_CONTROL) & 0xFF00) !=0)
    {
    AfxMessageBox("VK_DOWN+CTRL");
    }else
    {
    AfxMessageBox("VK_DOWN");
    }
    }
    break;
    case VK_ESCAPE:
    {
    //退出十字光标
    ;
    }
    break;
    default:
    break;
    } } return CDialog::PreTranslateMessage(pMsg);
    }
      

  6.   

    这是我的试验程序,注意这两行关键代码: if(pMsg->message == WM_KEYDOWN)
     {
    AfxMessageBox("ddd"); // 这行是测试用的代码,可以删除
    UINT nChar = pMsg->wParam;
             。下面的代码其实和你在OnKeyDown里面写的一样。
      

  7.   

    通常在VIEW里是可以处理上,下,左,右键的,
    不知道你是在哪里处理WM_KEYDOWN消息的?
    当然,你也可以在主框架里处理PreTranslateMessage
    怎样方便就看你自己了!(我一般在VIEW里就都解决了)
      

  8.   

    那位大侠能在CWnd的子类中,用OnKeyDown()在下解决问题。换方法不是根本,那位大侠能告诉我为什么不行,我过去的的vc6工程中是行的,可是在vc.net另一个工程中就不行了。
      

  9.   

    PreTranslateMessage(MSG *pMsg)会将left arrow变成TAB,所以就不会响应OnKeyDown解决方法:
    在PreTranslateMessage()里面
    {
      if(pMsg->message == WM_KEYDOWN)
      {
         //处理键盘消息
      }
    }
      

  10.   

    应该在 PreTranslateMessage 中处理
    因为在 OnKeyDown 处理消息时实际上很多按键消息已经被过滤掉了
    PreTranslateMessage(MSG *pMsg)
    {
      if(pMsg->message == WM_KEYDOWN)
      {
        switch(pMsg->wParam)
        {
        case VK_LEFT:
          ....
          retrun;
        case VK_RIGHT:
          ...
          return;
        default:
          break;
        }
      }
    }
      

  11.   

    PreTranslateMessage 是一个虚函数,你应该重载它来处理特殊按键的消息