PreTranslateMessage函数响应消息的问题,比如我按下ESC键,我要在PreTranslateMessage函数中处里pMsg-> wParam       ==       VK_ESCAPE的情况。问题是我现在在一个主对话框上有很多子对话框,子对话框上又有很子对话框,就是很多层了,我是想知道我按下ESC键时到底是那一层可以接获到VK_ESCAPE消息,我发现有时是主对话框,又时又是其他子对话框。想问一下这按下ESC键VK_ESCAPE消息是怎么确定发到哪个对话框上去的?是获得焦点的窗口?是最上面的窗口?

解决方案 »

  1.   

    先是线程的主窗口获取这个消息
    即AfxGetMainWnd得到的窗口
      

  2.   

    ESC是对话框默认退出键吧?
    如果当前对话框没有加入PreTranslateMessage函数,那当前对话框应该会退出,除非你代码里禁止ESC退出。如果当前对话框加入了这个函数,那按ESC键就是响应你自己的代码。
      

  3.   

    响应的是主对话框的(你的PreTranslateMessage写在了主对话框里),由于你选择的是ESC 所以你看到的可能是当前激活的对话框被关闭,误认为是响应的是子对话框,换个按键+条MessageBOx打印消息 你就知道了
      

  4.   

    我的对话框很多,我每个都加了,但不是每个的处理都一样,现在的问题是,不清楚按下ESC键到底哪个对话框能收到消息,我就是想知道,这消息怎么确定发到哪个对话框上去的?
      

  5.   

    我每个对话框里都写了,在里面都设断点,我是在
    if(pMsg-> message  == WM_KEYDOWN)       
    {   
    if(pMsg-> wParam ==VK_ESCAPE)
    {
    设断点处。

    }
    }
    跟踪后发现并不是什么情况都在主对话框里截获,有时是子对话框截获的。
      

  6.   

    typedef struct tagMSG { 
        HWND   hwnd;   
        UINT   message;
        WPARAM wParam;
        LPARAM lParam;
        DWORD  time;
        POINT  pt;
    } MSG, *PMSG, *NPMSG, *LPMSG; 
    virtual BOOL PreTranslateMessage( 
    MSG* pMsg ) 
    {CWnd *wnd=CWnd::FromHandle(pMsg->hwnd);
    if(wnd != NULL && wnd->IsKindOf( RUNTIME_CLASS(CDialog)))
    {
        pDlg = (CDialog *)wnd;//这就是接收消息对话框
    }
    }消息中是带有窗口信息的,没有测试,不知道对不对
      

  7.   

    typedef struct tagMSG { 
      HWND hwnd; 
      UINT message; 
      WPARAM wParam; 
      LPARAM lParam; 
      DWORD time; 
      POINT pt; 
    } MSG; 
    口说无凭,你用messagebox看看pMsg->hWnd是什么就知道了
      

  8.   

    我在OnSetFocus判断一子对话框是否得到焦点,没有进入这个函数,就是这个子对话框没有获得焦点吧,可是它却收到了VK_ESCAPE消息