热键一般是有Ctrl+其他键位或Alt+其他键位或Ctrl+Alt+其他键位构成。关于如何建立自己的热键,
下面就有详细的说明:
1:要定义一个热键(组合键)即必须先为热键赋于一个自定义的ID,用来给系统标识该热键。注意,
自定义的ID(int型)必须是唯一的,既不能与系统的其他ID相冲突。
2 运用函数RegisterHotKey
(
HWND hWnd, // 接收WM_HOTKEY的窗口句柄
int id, // hot key的ID号。
UINT fsModifiers, // 响应那个热键。
UINT vk // 与热键配合的键虚位码
)
当配合建为a(A) -z(Z),
和 0 - 9时,伴随建虚伪码可以用诸如'a','0'的形式代替。hWnd 为接受热键的窗口句柄,可以用
GetSafeHwnd()函数获得。自定义热键ID对于一个线程来讲一般设在0x0000 到0xBFFF(49151)之间,对于一个
DLL来讲其值一般设在0xC000(49152) 到0xBFFF(49151)之间。
fsModifiers可取如下值
MOD_ALT ;MOD_CONTROL ;MOD_SHIFT ;MOD_WIN 或他们的组合(中间用|连接)
3 定义热键的同时一般也要自定义热键相应的响应函数,其定义方法如下:
(1):先在某个类的头文件的其他消息响应函数的声明处按照相应的格式加上如下语句
afx_msg long OnHotKey(WPARAM wParam,LPARAM lParam);//wParam一般为热键消息的ID
(2): 在相应类的。cpp文件的消息映射宏BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP之间加上同其他消息
响应宏声明相同格式的自定义消息响应宏ON_MESSAGE(WM_HOTKEY,OnHotKey)
(3):然后就运用RegisterHotKey(…)函数定义快捷键。并在相应的消息响应函数OnHotKey(…)中加
如相应的处理代码。注意消息响应函数一定要有返回值,其可以使HRESULT,int ,long等数据类
型。
(4): 用完后不要忘了在OnDestory(…)函数或OnCancel(…)中解除函数登记,释放系统资源。此时
要调用函数 bool UnregisterHotKey(hWnd,VK(ID));
4 相应的例子如:
[程序实现]
建立名为My的对话框工程。本例要用到RegisterHotKey()实现Alt+D的快捷键组合功能。在调用该函数后你的进程会在ALT+D按下时比系统先得到通知。你需要处理的消息是WM_HOTKEY.
如下:
在MyDlg.h中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
class
CMyDlg :
public
CDialog
{
// Construction
public
:
int
m_nHotKeyID;
//为你自己定义的一个hot key的ID值,在整个程序唯一。
……
protected
:
HICON
m_hIcon;
// Generated message map functions
//{{AFX_MSG(CMyDlg)
virtual
BOOL
OnInitDialog();
afx_msg
void
OnSysCommand(
UINT
nID,
LPARAM
lParam);
afx_msg
void
OnPaint();
afx_msg
HCURSOR
OnQueryDragIcon();
afx_msg
LONG
OnHotKey(
WPARAM
wParam,
LPARAM
lParam);
//手动加入。
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
|
在MyDlg.cpp中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#define VK_D 68
……
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CHotKey1Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDOK, OnRegisterHotKey)
ON_BN_CLICKED(IDCANCEL, OnUnregisterHotKey)
ON_MESSAGE(WM_HOTKEY,OnHotKey)
//手动加入。
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL
CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About…" menu item to system menu.
m_nHotKeyID=0;
BOOL
m_isKeyRegistered = RegisterHotKey(GetSafeHwnd(),m_nHotKeyID,MOD_ALT,VK_D);
ASSERT(m_isKeyRegistered != FALSE);
return
TRUE;
// return TRUE unless you set the focus to a control
}
|
在取消按钮的事件函数中加入:
1
2
3
4
5
6
7
8
9
10
11
|
void
CMyDlg::OnCancel()
{
BOOL
m_iskeyUnregistered = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID);
ASSERT(m_iskeyUnregistered != FALSE);
CDialog::OnCancel();
}
|
处理截到的组合键,并处理:
1
2
3
4
5
6
7
8
9
10
11
|
LONG
CMyDlg::OnHotKey(
WPARAM
wParam,
LPARAM
lParam)
//wParam一般为热键消息的ID
{
AfxMessageBox(
"你按下了组合键:Alt+D"
);
//加入相关代码。
return
0;
}
|