vc 热键、组合键的用法 MFC c++ hotkey WM_HOTKEY
2013-06-08 16:21
387 查看
一下介绍的内容均在vc6.0 MFC程序调试通过。
【一】热键的使用
主要使用RegisterHotKey和UnregisterHotKey两个API函数,具体介绍请看MSDN。这里以编辑框作为示例,先建一个CEdit的派生类 CMyEdit2。
1)响应WM_HOTKEY消息
RegisterHotKey可以向窗口发送WM_HOTKEY消息,所以先定义WM_HOTKEY消息映射。
在.h文件中加入afx_msg LONG OnHotKey(WPARAM wParam,LPARAM lParam); ,具体位置在:
view plain
copy to clipboardprint?
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()
定义响应函数:
view plaincopy to
clipboardprint?
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;
}
3)Unregister热键
view plaincopy to
clipboardprint?
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
}
【二】(使用代码发送)发送组合键消息
1)发送WM_HOTKEY消息
view plaincopy to
clipboardprint?
WPARAM wParam;
LPARAM lParam;
//发送WM_HOTKEY消息,响应 ctrl + d 按键
wParam = 0;
lParam = MAKELONG(MOD_CONTROL,'D');
::SendMessage(hEditWnd,WM_HOTKEY, wParam, lParam);
WPARAM wParam;
LPARAM lParam;
//发送WM_HOTKEY消息,响应 ctrl + d 按键
wParam = 0;
lParam = MAKELONG(MOD_CONTROL,'D');
::SendMessage(hEditWnd,WM_HOTKEY, wParam, lParam);
【一】热键的使用
主要使用RegisterHotKey和UnregisterHotKey两个API函数,具体介绍请看MSDN。这里以编辑框作为示例,先建一个CEdit的派生类 CMyEdit2。
1)响应WM_HOTKEY消息
RegisterHotKey可以向窗口发送WM_HOTKEY消息,所以先定义WM_HOTKEY消息映射。
在.h文件中加入afx_msg LONG OnHotKey(WPARAM wParam,LPARAM lParam); ,具体位置在:
view plain
copy to clipboardprint?
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),具体位置在: view plaincopy to clipboardprint? 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() 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()
定义响应函数:
view plaincopy to
clipboardprint?
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)登记热键 view plaincopy to clipboardprint? 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 } 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热键
view plaincopy to
clipboardprint?
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函数只被调用一次。 view plaincopy to clipboardprint? 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; } 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消息
view plaincopy to
clipboardprint?
WPARAM wParam;
LPARAM lParam;
//发送WM_HOTKEY消息,响应 ctrl + d 按键
wParam = 0;
lParam = MAKELONG(MOD_CONTROL,'D');
::SendMessage(hEditWnd,WM_HOTKEY, wParam, lParam);
WPARAM wParam;
LPARAM lParam;
//发送WM_HOTKEY消息,响应 ctrl + d 按键
wParam = 0;
lParam = MAKELONG(MOD_CONTROL,'D');
::SendMessage(hEditWnd,WM_HOTKEY, wParam, lParam);
相关文章推荐
- vc 热键、组合键的用法 MFC c++ hotkey WM_HOTKEY
- vc 热键、组合键的用法 MFC c++ hotkey WM_HOTKEY
- vc 热键、组合键的用法 MFC c++ hotkey WM_HOTKEY
- vc 热键、组合键的用法 MFC c++ hotkey WM_HOTKEY
- vc 热键、组合键的用法 MFC c++ hotkey WM_HOTKEY
- vc 热键、组合键的用法
- (C++) HotKey of MFC
- C C++ VC MFC 命名规范
- C++/VC/MFC字符串/文件加解密
- C++ MFC 计时器(OnTimer)的用法实例
- VC MFC菜单栏(CMenu)控件用法
- VC ++ MFC编程--ListCtrl控件的用法
- VC/MFC(C++)实现文件拷贝和文件删除等
- C++ 常用代码001 IsValidFileName VC/MFC 判断有效文件名
- MFC--快捷键(组合键/热键)与按钮实现操作按钮的方法
- C++、VC、MFC 计算任意函数值、计算表达式、积分、线性方程组
- 将屏幕保存为图片 将当前MFC程序保存为图片 c++ vc
- MFC--快捷键(组合键/热键)与按钮实现操作按钮的方法
- VC/C++/MFC 获取IE浏览器的滚动条位置
- MFC--快捷键(组合键/热键)与按钮实现操作按钮的方法