我正在为我的MFC应用程序分配一个热键。即使我的应用程序没有成为焦点,我希望它能够正常工作。
我正在使用Visual Studio 2013.
我的对话框继承了CWnd
类,如下:
class CMyClass : public CWnd
在课堂上,我定义了这个:
protected:
//...
afx_msg void OnHotKey(UINT id, UINT key1, UINT key2);
编辑:我也尝试在那里放置override
关键字,但它告诉我它不会继承基类成员。
在我的实施中:
void CMyClass::OnHotKey(UINT id, UINT key1, UINT key2)
{
if (id == 1 || id == 2)
{
// do something
}
}
在我的构造函数中:
if (!RegisterHotKey(NULL /* also tried m_hWnd */, 1, MOD_ALT | MOD_SHIFT, 0x56 /* 'V' */))
{
// do some failure code, but it passes
}
if (!RegisterHotKey(NULL /* also tried m_hWnd */, 2, MOD_ALT | MOD_SHIFT, 0x76 /* 'v' */))
{
// do some failure code.. but it passes
}
在我的析构函数中:
// Unregister hotkeys
UnregisterHotKey(NULL /* also tried m_hWnd */, 1);
UnregisterHotKey(NULL /* also tried m_hWnd */, 2);
在我的BEGIN_MESSAGE_MAP
:
ON_WM_HOTKEY()
现在我调试了它,即使我按下SHIFT + ALT +'v',它也没有进入OnHotKey
函数。
关于可能出现什么问题的任何想法?
答案 0 :(得分:3)
问题是当窗口句柄尚未初始化时,您正在构造函数中注册热键。
您应该在OnCreate()
中初始化热键,如下所示:
::RegisterHotKey(GetSafeHwnd(), 1, MOD_ALT | MOD_SHIFT, 'V');
::RegisterHotKey(GetSafeHwnd(), 2, MOD_ALT | MOD_SHIFT, 'v');
取消注册部分应在OnDestroy()
:
::UnregisterHotKey(GetSafeHwnd(), 1);
::UnregisterHotKey(GetSafeHwnd(), 2);