WM_HOTKEY没有捕获

时间:2015-10-24 10:26:41

标签: c++ winapi visual-studio-2013 mfc

我正在为我的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函数。

关于可能出现什么问题的任何想法?

1 个答案:

答案 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);