工程中有很多个对话框,非模态的,希望在任意一个对话框显示的时候,按快捷键能将其中一个指定的对话框A显示出来,按另一个快捷键能将其隐藏起来。请问该如何实现?另外问一下,这里的快捷键是不是要要和常用的快捷键“Alt+F4,Ctrl+C,Ctrl+Shift+Delete”不能重复呢?
第2个问题,我的对话框中有很多个按钮,要求每个按钮都有对应的快捷键,这里的快捷键是不是不能和上面的快捷键重复,并且不能和常用的快捷键“Alt+F4,Ctrl+C,Ctrl+Shift+Delet”重复?

解决方案 »

  1.   

    按键只要不在你自己的工程中重复就可以了。写获取按键消息函数,然后显示DLG 即可!
      

  2.   

    注册热键,RegisterHotKey
    然后响应WM_HOTKEY消息,
    WM_HOTKEY消息响应函数要自己写,
      

  3.   

    第2个问题,我的对话框中有很多个按钮,要求每个按钮都有对应的快捷键,这里的快捷键是不是不能和上面的快捷键重复,并且不能和常用的快捷键“Alt+F4,Ctrl+C,Ctrl+Shift+Delet”重复?
    ========================
    可以将系统热键拦截,变成你自己的,但为什么要拦截?
      

  4.   

    error C2440: “static_cast”: 无法从“void (__thiscall CTestHotKeyDlg::* )(UINT,UINT,UINT)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”
            从基类型到派生类型的强制转换需要 dynamic_cast 或 static_cast这个问题如何解决?
    可以将系统热键拦截,变成你自己的,但为什么要拦截?
    ==========================================
    有一些系统快捷键自己不知道,那万一程序中用到了不是要出错?
      

  5.   

    .h中  afx_msg HRESULT OnHotKey(WPARAM wp,LPARAM lp);.cpp中 ON_MESSAGE(WM_HOTKEY,OnHotKey) RegisterHotKey(m_hWnd,1688,MOD_SHIFT|MOD_CONTROL,'A'); 
    RegisterHotKey(m_hWnd,2688,MOD_SHIFT|MOD_CONTROL,'Q'); 
    LRESULT CTestHotKeyDlg::OnHotKey(WPARAM wParam,LPARAM lParam) 
    {  if(wParam==1688) 

    dlg2->ShowWindow(SW_SHOW);

    if(wParam==2688)
    {
    dlg2->ShowWindow(SW_HIDE);
    }
    return 0;
    } UnregisterHotKey(m_hWnd,1688); 
    UnregisterHotKey(m_hWnd,2688); 
    参考的资料,这样写出的问题。
    如果添加VW_HotKey消息的话,自动生成的消息响应函数是void CTestHotKeyDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
    这三个参数怎么用呢?
      

  6.   

    改来改去怎么又不出问题了,真奇怪,上面的代码没有问题,不需要让系统自己添加VW_HotKey的消息响应函数,直接粘贴代码就行。最近接连几次出现代码一会出错,一会又不出错的情况,中间有项目的清理和重新编译的操作,难道VS2008的BUG?谁能告诉下用系统生成的void CTestHotKeyDlg实现?
      

  7.   

    谁能告诉下用系统生成的void CTestHotKeyDlg实现?
    ===============??????????????函数 ? 类?系统?
    A. 首先是注册系统热键 RegisterHotKeyBOOL RegisterHotKey(HWND hWnd, int id, UINT fsModifiers, UINT vk); hWnd : 指定响应该热键的窗体
     id : 指定响应该事件的 id
     fsModifiers : 指定组合键。这个值可以由 MOD_ALT MOD_CONTROL MOD_SHIFT MOD_WIN 中的一个或几个组成。
     vk : 指定热键的虚拟键值。如 'A'例如在本例中注册一个 Ctrl+Alt+Q 的热键。在 CTestHotkeyDlg特定的地方中调用:
    RegisterHotKey(this->m_hWnd, 0x1998, MOD_CTRL | MOD_ALT, 'Q');B. 接着响应并实现系统热键消息 WM_HOTKEY添加消息映射 ON_MESSAGE(WM_HOTKEY,OnHotKey) 并实现函数 OnHotKeyLRESULT CHotKeyTestDlg::OnHotKey(WPARAM wParam, LPARAM lParam)
    {
       MessageBox("You press Ctrl+Alt+Q");
       return 0;
    }C. 最后,可别忘了在程序结束时撤销注册的热键 UnRegisterHotKeyvoid CHotKeyTestDlg::OnDestroy()
    {
       CDialog::OnDestroy();
       UnregisterHotKey(this->m_hWnd,1000);
    }网上拷的源码,不知道行不