VC系统热键的注册

使用系统热键可以这么进行,假设我们在 CTestHotkeyDlg 这个类进行热键测试。

A. 首先是注册系统热键 RegisterHotKey

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

 hWnd : 指定接收WM_HOTKEY消息的窗体句柄
 id :
指定响应该事件的 id, 应用程序中的标识值在0x0000和0xbfff之间,DLL中的在0xc000和0xffff之间
 fsModifiers : 指定组合键。这个值可以由 MOD_ALT MOD_CONTROL MOD_SHIFT MOD_WIN 中的一个或几个组成。
 vk : 指定热键的虚拟键值。如 'A'

例如在本例中注册一个 Ctrl+Alt+Q 的热键。在 CHotkeyDlg特定的地方中调用:
RegisterHotKey(this->m_hWnd, 0x1998, MOD_CTRL | MOD_ALT, 'Q');

B. 接着响应并实现系统热键消息 WM_HOTKEY

加入消息映射

ON_MESSAGE(WM_HOTKEY,OnHotKey)
加入函数
afx_msg void OnHotKey(WPARAM wParam, LPARAM lParam);

并实现函数 OnHotKey

LRESULT CHotkeyDlg::OnHotKey(WPARAM wParam, LPARAM lParam)
{
   MessageBox("You press Ctrl+Alt+Q");
   return 0;
}

C. 最后,在程序结束时撤销注册的热键 UnRegisterHotKey

void CHotkeyDlg::OnDestroy()
{
   CDialog::OnDestroy();
   UnregisterHotKey(this->m_hWnd,1000);
}

到此系统热键的工作全部完成。

 ——————————————————————————————————————————————————

最好不要直接用0x1998, 0x1220等数,以防止热键冲突
ATOM m_atom1,m_atom2;    //
保存全局原子

ATOM TmpID=GlobalFindAtom("my first hotkey");
if TmpID=0 then //
查找全局原子.如果返回值不为0,则说明这个全局原子已经被注册;


m_atom1 = GlobalAddAtom("my first hotkey");
m_atom2 = GlobalAddAtom("my second hotkey");
BOOL m_isKeyRegistered;
m_isKeyRegistered = RegisterHotKey(GetSafeHwnd(),m_atom1, MOD_CONTROL|MOD_SHIFT, 0x4e);
ASSERT(m_isKeyRegistered != FALSE);     //
调试时用(当前热键已经被注册时会返回失败)
//
注册第二个始终不行

if(RegisterHotKey(GetSafeHwnd(), m_atom2, MOD_CONTROL, 0x4d) == FALSE)
{
   MessageBox("error", NULL, MB_OK);
}

你可能感兴趣的:(C++,VC,注册系统热键)