cheng_you_know

学而时习之!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

MFC c++ hotkey WM_HOTKEY  转网友:http://blog.csdn.net/hityct1/article/details/3853666

【一】热键的使用

主要使用RegisterHotKey和UnregisterHotKey两个API函数,具体介绍请看MSDN。这里以编辑框作为示例,先建一个CEdit的派生类 CMyEdit2。

1)响应WM_HOTKEY消息

  RegisterHotKey可以向窗口发送WM_HOTKEY消息,所以先定义WM_HOTKEY消息映射。

  在.h文件中加入afx_msg LONG OnHotKey(WPARAM wParam,LPARAM lParam);  ,具体位置在:

protected:
    //{{AFX_MSG(CMyEdit2)
    afx_msg void OnDestroy();
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    //}}AFX_MSG
    afx_msg LONG OnHotKey(WPARAM wParam,LPARAM lParam);//手动加入
    DECLARE_MESSAGE_MAP()

在.cpp文件中加入ON_MESSAGE(WM_HOTKEY,OnHotKey),具体位置在:

BEGIN_MESSAGE_MAP(CMyEdit2, CEdit)
    //{{AFX_MSG_MAP(CMyEdit2)
    ON_WM_CHAR()
    ON_WM_DESTROY()
    ON_WM_CREATE()
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_HOTKEY,OnHotKey) //手动加入
END_MESSAGE_MAP()

定义响应函数:

LONG CMyEdit2::OnHotKey(WPARAM wParam,LPARAM lParam)         
{

    UINT fuModifiers = (UINT) LOWORD(lParam);  // key-modifier flags 
    UINT uVirtKey = (UINT) HIWORD(lParam);     // virtual-key code 

    //判断响应了什么热键
    if( MOD_CONTROL == fuModifiers && 'D' == uVirtKey )
    {
        AfxMessageBox(_T("你按下了组合键 ctrl + d"));  
    }
    else if( MOD_ALT == fuModifiers && 'M' == uVirtKey )
    {
        AfxMessageBox(_T("你按下了组合键 alt + m"));  
    }
    else
        AfxMessageBox(_T("你按下了未知热键"));  
                         
    return 0;        
}

2)登记热键

void CMyEdit2::Init()
{
//此函数可以在PreSubclassWindow和OnCreate中使用;
//如果不在前两者中使用,可以到放到CDialog::OnInitDialog或者
//CView::OnInitialUpdate函数中使用

    ASSERT(NULL != GetSafeHwnd());

    //Register热键
#ifdef _DEBUG //debug版本
    int nRet = RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[0],MOD_CONTROL,'D'); //热键 ctrl + d
    if(!nRet)
        AfxMessageBox(_T("RegisterHotKey 0 false"));
    nRet = RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[1],MOD_ALT,'M'); //热键 alt + m
    if(!nRet)
        AfxMessageBox(_T("RegisterHotKey 1 false"));
#else //release版本
    RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[0],MOD_CONTROL,'D'); //热键 ctrl + d
    RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[1],MOD_ALT,'M'); //热键 alt + m
#endif
}

3)Unregister热键

 

void CMyEdit2::OnDestroy() 
{
    CEdit::OnDestroy();

    //Unregister热键
#ifdef _DEBUG    
    int nRet = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[0]); 
    if(!nRet)
        AfxMessageBox(_T("UnregisterHotKey 0 false"));
    nRet = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[1]); 
    if(!nRet)
        AfxMessageBox(_T("UnregisterHotKey 1 false"));
#else
    UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[0]); 
    UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[1]); 
#endif

}

附:Init()的使用位置,这里用变量IsInit(bool值)保证Init函数只被调用一次。

void CMyEdit2::PreSubclassWindow() 
{
    //初始化
    if( !IsInit )
    {
        Init();
        IsInit = true;
    }
    
    CEdit::PreSubclassWindow();
}

int CMyEdit2::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CEdit::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    //初始化
    if( !IsInit )
    {
        Init();
        IsInit = true;
    }
    
    return 0;
}

【二】(使用代码发送)发送组合键消息

1)发送WM_HOTKEY消息

WPARAM wParam;
    LPARAM lParam;

    //发送WM_HOTKEY消息,响应 ctrl + d 按键
    wParam = 0;
    lParam = MAKELONG(MOD_CONTROL,'D');
    ::SendMessage(hEditWnd,WM_HOTKEY, wParam, lParam);
posted on 2013-06-20 14:43  cheng_you_know  阅读(688)  评论(0编辑  收藏  举报