返回首页
当前位置: 主页 > 编程语言 > C/C++教程 >

Windows RegisterHotKey编程实践

时间:2015-11-12 23:29来源:电脑教程学习网 www.etwiki.cn 编辑:admin

什么是RegisterHotKey?

RegisterHotKey函数被用来定义一个系统范围的热键;那什么是热键,热键即快捷键;至于什么是快捷键,这里就不进行扫盲了,你可以向度娘咨询。

函数原型及参数说明

BOOL RegisterHotKey(HWND hWnd, int id, UINT fsModifiers, UINT vk);

hWnd:当按下了定义的热键时,会产生一个WM_HOTKEY的消息,而hWnd表示用来接收WM_HOTKEY消息的窗口句柄;如果这个参数为NULL,WM_HOTKEY消息就会扔进调用者线程的消息队列中,进行消息循环,然后再被处理掉;

id:指定的热键标识符;在调用者线程中,不允许有相同的热键标识符。一个应用程序必须指定一个在0×0000到0xBFFF范围之内的值;而对于一个共享的DLL来说,必须指定一个在0xC000到0xFFFF范围之内的值。为了避免定义的热键标识符和其它共享DLL定义的热键标识符冲突了,共享DLL应该使用GlobalAddAtom函数来生成一个热键标识符;

fsModifiers:定义为了产生WM_HOTKEY消息而必须与由vk参数定义的键一起按下的键;该参数可以指定以下值:

  1. MOD_ALT:表示按下键盘上的任意一个Alt键;
  2. MOD_CONTROL:表示按下键盘上的任意一个Control键;
  3. MOD_SHIFT:表示按下键盘上的任意一个Shift键;
  4. MOD_WIN:表示按下键盘上的任意一个Win键。

vk:表示热键的虚拟键位码。

返回值说明:当函数调用成功时,返回为非零值;当函数调用失败时,返回值为0,可以调用GetLastError函数获得错误码。

编程实践

创建一个简单的MFC程序;添加一个按钮,按钮处理程序如下:

void CRegisterHotKeyDemoDlg::OnBnClickedOk(){
	// Get the hot key id
	m_iHotKeyId = GlobalAddAtom(wsHotKey) - 0xC000;
	if (m_iHotKeyId <= 0)
		return;

	// Register the hot key
	m_bRet = RegisterHotKey(m_hWnd, m_iHotKeyId, MOD_CONTROL, 0x46);
	if (!m_bRet)
		return;}

添加WM_HOTKEY事件的处理代码:

void CRegisterHotKeyDemoDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2){
	// Handle the hot key message
	if (nHotKeyId == m_iHotKeyId)
	{
		MessageBox(L"This is a demo", L"RegisterHotKey");
	}

	CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);}

在析构函数中添加释放处理:

CRegisterHotKeyDemoDlg::~CRegisterHotKeyDemoDlg(){
	if (m_bRet)
	{
		UnregisterHotKey(m_hWnd, m_iHotKeyId);
		m_bRet = false;
	}

	if (m_iHotKeyId > 0)
	{
		GlobalDeleteAtom(m_iHotKeyId + 0xC000);
		m_iHotKeyId = 0;
	}}

(工程下载)

注意事项

在实际开发中,我们经常是使用GlobalAddAtom获得一个id,所以,我们定义了一个全局的字符串变量:

const wchar_t *wsHotKey = L”HotKeyDemo”;

使用GlobalAddAtom获得的id范围是0xC000到0xFFFF,而应用程序要求id范围为0×0000到0xBFFF,所以,使用GlobalAddAtom获得的id减去0xC000就能得到一个在范围为0×0000到0xBFFF之内的id。当使用GlobalAddAtom之后,必须对应的需要使用GlobalDeleteAtom删除对应的id;同理,当使用RegisterHotKey注册了一个热键,程序退出时,也需要使用UnregisterHotKey注销对应的热键。

当某键被接下时,系统在所有的热键中寻找匹配者。一旦找到一个匹配的热键,系统将把WM_HOTKEY消息传递给登记了该热键的线程的消息队列。该消息被传送到队列头部,因此它将在下一轮消息循环中被移去。该函数不能将热键同其他线程创建的窗口关联起来。

若为一热键定义的击键己被其他热键所定义,则RegisterHotKey函数调用失败。

若hWnd参数标识的窗口已用与id参数定义的相同的标识符登记了一个热键,则参数fsModifiers和vk的新值将替代这些参数先前定义的值。

最后,感叹人生,为什么有的时候不能做自己喜欢做的事情呢?

顶一下
(0)
0%
踩一下
(0)
0%
标签(Tag):c程序 C语言
------分隔线----------------------------
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
推荐内容