我在框架类中添加了
void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值 CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
调试运行,发现没有进入消息处理函数中。连菜单的快捷键也不起作用,在任何一个对话框中添加OnKeyDown,结果都没进去,现在整个程序都已经快完成一大半了才发现这个问题,请高手指点,万分感谢!

解决方案 »

  1.   

    应该不是被拦截,因为用PreTranslateMessage(MSG* pMsg)可以捕捉到按键消息。
      

  2.   

    有没有SetWindowLong
    有没有钩子?
      

  3.   

    是有一个SetWindowLong,不过这个是在一个子对话框里面用的,应该不会影响到框架吧
      

  4.   

    一个子对话框WaveDlg
    BOOL WaveDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();
    SetWindowLong(m_hWnd,  //设置对话框透明
    GWL_EXSTYLE,  
    GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
    // Make this window 70% alpha
    SetLayeredWindowAttributes( 0, (255 * 70) / 100, LWA_ALPHA);
    return TRUE;
    }
    BOOL WaveDlg::OnEraseBkgnd(CDC* pDC)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    SetWindowLong(m_hWnd,  //设置对话框透明
    GWL_EXSTYLE,  
    GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
    // Make this window 70% alpha
    SetLayeredWindowAttributes( 0, (255 * 70) / 100, LWA_ALPHA);
    return TRUE;
    //return CDialog::OnEraseBkgnd(pDC);
    }
      

  5.   

    /////////////////////////////////////////////////////
    // 实在不行就在这里面做:
    BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
    {
        if(pMsg->message==WM_KEYDOWN)
        {
            // 在这里面处理按按消息,或调用按键处理函数;
            // ...
            return true;
        }
        return CDialog::PreTranslateMessage(pMsg);
    }/////////////////////////////////////////////////////
      

  6.   

    界面有焦点时,才能处理键盘消息
    是不是焦点一直在WaveDlg对话框上?
      

  7.   

    而且你的WaveDlg并没有拦截键盘消息啊
      

  8.   

    //未添加按键消息响应处理函数
    BOOL CYourDlg::PreTranslateMessage(MSG* pMsg)
    {
      if(pMsg->message==WM_KEYDOWN)
      {
      ;
      // ...
      return true;
      }
      return CDialog::PreTranslateMessage(pMsg);
    }