我的程序是基于对话框的程序。有两个对话框窗口。一个是主对话框窗口。另一个是非模态对话框。
我给主对话框加了快捷键。
如下:///////////////////////////////////////   
  1.在CMyDlg的类声明中添加:   
  HACCEL     m_hAccel;   
  2.在构造函数中添加;   
  m_hAccel   =   NULL;   
  3.在OnInitDialog()中添加:   
  m_hAccel   =   LoadAccelerators(AfxGetInstanceHandle(),   MAKEINTRESOURCE(IDR_DLGACCEL));   
  4.重载PreTranslateMessage()函数,添加:   
          ...   
          if(m_hAccel)   
          {   
                  if(::TranslateAccelerator(GetSafeHwnd(),   m_hAccel,   pMsg))   
                          return   TRUE;   
          }   
          ...   
  成功!
但后来发现一个问题。当视窗焦点位于非模态对话框时。主对话框窗口的快捷键就失效了!!!
我希望在非模态对话框拥有焦点时。主对话框窗口的快捷键仍然有效。请问怎么办??

解决方案 »

  1.   

    失去焦点,你进行按键的话,你的非模态对话框就处理了按键消息。主窗口无法收到这个消息。使用1楼兄弟说的API吧,那个是系统级的。
    The RegisterHotKey function defines a system-wide hot key.
      

  2.   

    showwinhotkey_ = GlobalAddAtom(_T("_GUID_NAME_"));
    if(!RegisterHotKey(m_hWnd, showwinhotkey_, MOD_WIN, 'V'))
    {
       GlobalDeleteAtom(showwinhotkey_);
       AfxMessageBox(_T("注册热键Win+V显示窗口失败!!"));
    }
    记得退出的时候释放资源,
    if(showwinhotkey_)
    {
        UnregisterHotKey(m_hWnd, showwinhotkey_);
        GlobalDeleteAtom(showwinhotkey_);
    }
      

  3.   

    不要在对话框类的PreTranslateMessage函数中处理,改成重载App类的PreTranslateMessage函数。
      

  4.   

    BOOL RegisterHotKey(
    HWND hWnd,                     // 接收WM_HOTKEY的窗口句柄
    int id,                        // hot key的ID号.
    UINT fsModifiers,              // 响应那个热键.
    UINT vk                        // 与热键配合的键.
    1.在MyDlg.h中:
    afx_msg void OnHotKey(WPARAM wParam,LPARAM lParam);2.MyDlg.cpp中:
    BEGIN_MESSAGE_MAP(CMyDlg, CDialog) 下面加入
    ON_MESSAGE(WM_HOTKEY,OnHotKey)           3.oninitdialog 中:RegisterHotKey(GetSafeHwnd(),m_nHotKeyID,NULL,VK_F3);4.在取消按钮的事件函数中加入:BOOL m_iskeyUnregistered = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID);
    ASSERT(m_iskeyUnregistered != FALSE);5.
    void CMyDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
    {
    AfxMessageBox("你按下了组合键:Alt+E");
    return 0;
    }