右键菜单弹出后,窗口接收不到键盘消息;
怎样可以在右键菜单弹出后,窗口还能接收到键盘消息

解决方案 »

  1.   

    使用TrackPopupMenu弹出菜单后,会进入菜单的循环中,可以参考WM_ENTERMENULOOP和WM_EXITMENULOOP
      

  2.   

    不清楚你的菜单是从那里得来的,我在单文档工程下,试验了一下;
    LRESULT C**View::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    if( message == WM_MENUCHAR )
    {
    if( (char)LOWORD(wParam) == 'z')
    {
    //AfxMessageBox("View MENU_KEY = 'z'"); //在这里添加你的z按键消息响应函数;
    }
    if( (char)LOWORD(wParam) == 'm')
    {
    //AfxMessageBox("View MENU_KEY = 'm'"); //在这里添加你的m按键消息响应函数;
    CDC * pdc = this->GetDC();
    pdc->MoveTo(0,0);
    pdc->LineTo(100,100);
    }
    }
    return CView::DefWindowProc(message, wParam, lParam);
    }
    WM_MENUCHAR的相关定义:
        char chUser =   (char)   LOWORD(wParam);   //   ASCII   character     
        UINT fuFlag =   (UINT)   HIWORD(wParam);  //   menu   flag     
        HMENU hmenu =   (HMENU)   lParam;          //   handle   of   menu  
    我的菜单加载是在这里:
    void C**View::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    CMainFrame* pfrm =(CMainFrame*)AfxGetMainWnd();  //获得程序主框架指针 
    pfrm->GetMenu();                                 //获得程序菜单指针 
    CMenu* pm = pfrm->GetMenu()->GetSubMenu(0);      //指向“文件”菜单 

    CPoint pt; 
    GetCursorPos(&pt); 
    pm->TrackPopupMenu(TPM_LEFTALIGN,pt.x,pt.y,this); //单击右键菜单时弹出“文件”菜单指针

    CView::OnLButtonDown(nFlags, point);
    }
    问题其实还是在TrackPopupMenu这个函数上,最后一个参数this指明了Menu的消息将发往当前的View类窗口。(如果改成AfxGetMainWnd(),将发往主窗体,响应的DefWindowProc则应该定义在CMainFrame类中)这个消息的截获我先前在PreTranslateMessage(MSG* pMsg) 中去做,没有实现,后来才换到DefWindowProc当中的。原因可能就是下面这段话当中的"理论上"所对应的"现实",可能菜单这个时候发送消息使用的是SendMessage:1.在MFC下,PreTranslateMessage()函数中只能得到PostMessage()发送的消息,而对于  
    SendMessage()是无能为力的,因为这种类型的消息是由GetMessage、PeekMessage()等函数系统  
    自身处理的。  2.Windows操作系统中,对于产生的键盘消息,基本上都是由PostMessage()形式发送的,所以对于  
    键盘操作,理论上PreTranslateMessage()都是可以得到的。 
    引自:http://blog.csdn.net/caleeoo/archive/2008/02/25/2119173.aspx问题残留:如果是组合按键的话,例如:Shift+z,可以用"Z"来代替,但是如果是Ctrl+z那就不知道怎么弄了。
    楼主去试试吧,我想组合键应该也没有问题。 End......
      

  3.   

    Tinary3v0 :你的方法不能得到CTRL键,而且也判断不出是否是弹起。
    现在我处理的方法,如果按了CTRL键,就不让用户在使用右键菜单