CYourDlgDlg::PreTranslateMessage(MSG* pMsg) 处理 WM_KEYDOWN

解决方案 »

  1.   

    2
    处理按钮点击操作
    将OnOk() OnCancel()
    中的CDialog::OnOk() CDialog::OnCancel()去掉
      

  2.   

    在InitDialog中
    RegisterHotKey(NULL,0x0001,MOD_CONTROL,VK_X);//定义了一个Ctrl+X热键
    在OnDestroy中,UnRegsiterHotKey诸如此类!
      

  3.   

    1.做热键
    在对话框的OnInitDialog函数中
    RegisterHotkey(
      GetSafeHwnd(), //窗口句柄
      0x0001, //热键的ID,每个热键不同
      MOD_CONTROL|MOD_SHIFT, //辅助键
      VK_X //基本键
    );
    //上面的函数定义了Ctrl+Shift+X热键,ID为0x0001
    2.响应WM_HOTKEY消息
    因为WM_HOTKEY不是常用的消息,需自己添加消息映射
    在对话框头文件里定义响应函数
    afx_msg void OnMyHotKey(
    WPARAM wParam,   // hot key identifier
    LPARAM lParam    // options and virtual-key code
    );
    在BEGIN_MESSAGE_MAP(CDlgDlg, CDialog)

    END_MESSAGE_MAP()中间写上
    ON_MESSAGE(WM_HOTKEY,OnMyHotKey)
    下面是OnMyHotKey的实现
    void CDlgDlg::OnMyHotKey(WPARAM wparam,LPARAM lParam) 
    {
      if(wParam==0x0001)//是我们定义的热键
      {
        MessageBox("A");
      }
    }2.重写OnOK和OnCancel,让它们什么都不做。
    或者重写PreTranslateMessage
    BOOL CDlgDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if(pMsg->message==WM_KEYDOWN){
    if(pMsg->wParam==VK_ESC||pMsg->wParam==VK_ENTER);//不干活
    }
    return CDialog::PreTranslateMessage(pMsg);
    }3.够详细了么?
      

  4.   

    另:对于热键,在OnDestroy中要UnRegisterHotKey,参数看MSDN.