做一个对话框程序,在用户按下ESC键后,程序退出。现在希望这样,当用户按下ESC后,程序首先截获到这个消息,然后进行一些处理,这些处理必须在系统进行默认的ESC处理之前进行,必须保证这个次序。请问这个该怎么做?多谢。

解决方案 »

  1.   

    在PreTranslateMessage中处理
    if(WM_KEYDOWN == pMsg->message && VK_ESCAPE == pMsg->wParam )
    {
    //add your func
    }
      

  2.   

    重载PreTranslateMessage函数屏蔽回车和ESC的消息:
    BOOL C***Dlg::PreTranslateMessage(MSG* pMsg)   
    {   
        if(WM_KEYDOWN == pMsg->message )   
       {   
            UINT nKey = (int) pMsg->wParam;   
            if(VK_ESCAPE == nKey )  
            {
               //do what you want           return TRUE ; 
            }   
       }  
      
        return CDialog::PreTranslateMessage(pMsg);   
    }  
      

  3.   

    1,在程序注册这个热键
    (1)在头文件里声明
    afx_msg LONG OnHotKey(WPARAM wParam,LPARAM lParam);
    (2)在消息映射里添加:
    ON_MESSAGE(WM_HOTKEY,OnHotKey)
    (3)在对话框初始化时注册热键
    RegisterHotKey(this->m_hWnd,1001,0,VK_ESCAPE);
    (4)定义响应函数
    LONG CXXXDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
    {
    switch(wParam)
    {
    case 1001:
    //你要做的事
    break;
            default:
               break;
             }
        return 0;
    }
    2,利用全局的HOOK钩子,先捕捉键盘按键的消息。这方面比较麻烦,你可以搜索下HOOK的资料。
      

  4.   

    见到对话框上的"取消"按钮了没?
    双击该按钮,产生取消按钮的Click消息.
    差生如下
    void 类名::_NormalInfo::OnBnClickedCancel()
    {
       这里添加你要进行的处理..
       OnCancle();
    }
      

  5.   

    在PreTranslateMessage中处理
    if(WM_KEYDOWN == pMsg->message && VK_ESCAPE == pMsg->wParam )
    {
    //add your func
    }
    //ding