您的位置:首页 > 编程语言 > C语言/C++

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()

在.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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: