WM_HOTKEY not catching

WM_HOTKEY not catching

本文关键字:catching not HOTKEY WM      更新时间:2023-10-16

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

有什么想法可能是问题吗?

问题是,当窗口句柄尚未初始化时,您正在构造函数中注册热键

你应该像这样在OnCreate()中初始化你的热键:

::RegisterHotKey(GetSafeHwnd(), 1, MOD_ALT | MOD_SHIFT, 'V');
::RegisterHotKey(GetSafeHwnd(), 2, MOD_ALT | MOD_SHIFT, 'v');

注销部分应在OnDestroy()中完成:

::UnregisterHotKey(GetSafeHwnd(), 1);
::UnregisterHotKey(GetSafeHwnd(), 2);