Winapi 在WM_SYSKEYDOWN中吃键

Winapi 在WM_SYSKEYDOWN中吃键,winapi,visual-c++,Winapi,Visual C++,当按下alt或F10时,我需要处理发送到我的窗口的WM_SYSKEYDOWN消息,所以我在我的窗口的pretranslatemessage中这样做了 我检查了发送给WM_SYSKEYDOWN的MSG参数消息,并返回了true,这与此类似 BOOL Class::PreTranslateMessage(MSG* pMsg) { MSG *pMessage = (MSG *)pMsg; HWND hwnd = ::GetActiveWindow(); if(::IsWindo

当按下alt或F10时,我需要处理发送到我的窗口的WM_SYSKEYDOWN消息,所以我在我的窗口的pretranslatemessage中这样做了

我检查了发送给WM_SYSKEYDOWN的MSG参数消息,并返回了true,这与此类似

BOOL Class::PreTranslateMessage(MSG* pMsg)
{
    MSG *pMessage = (MSG *)pMsg;
    HWND hwnd = ::GetActiveWindow();
    if(::IsWindowEnabled(hwnd)==NULL){
        if(pMsg->message = WM_SYSKEYDOWN)
    {
    return true;
    }
    }
    return parentclass::PreTranslateMessage(pMsg);
}
但当用户按下alt键时,不会触发此功能

我在spy++中验证了当用户单击alt键时,WM_SYSKEYDOWN消息被发送到我为其编写pretranslatemessage的窗口

我可以通过编写消息处理程序来解决此问题

void Class::OnSysKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags)
{
    HWND hwnd = ::GetActiveWindow();
    if(::IsWindowEnabled(hwnd)==NULL){
        return;
    }
    parentclass::OnSysKeyDown(nChar,nRepCnt,nFlags);
}

在消息映射中包含WM\U SYSKEYDOWN,我在看到你的帖子后有点好奇,所以我做了一个快速测试,正如预期的那样,WM\U SYSKEYDOWN肯定会在Alt-F10组合中发送(因为该消息专门针对Alt组合键)。事实上,您将收到4条消息,结果如下:

   Message       Key    Char      Repeat    Scan   Ext   Alt   Prev   Tran
-----------------------------------------------------------------------------
WM_SYSKEYDOWN     18    Alt         1        56     No   Yes    Up    Down
WM_SYSKEYDOWN    121    F10         1        68     No   Yes    Up    Down
 WM_SYSKEYUP     121    F10         1        68     No   Yes   Down    Up
 WM_SYSKEYUP      18    Alt         1        56     No    No   Down    Up

因此,请仔细检查您的代码,我相信您将确定问题所在。我希望这有帮助

有必要指出Pretransaltemessage()拼写错误吗?它可能是,C++编译器不闪烁时,你扔GobDeDeGook在这样。它盲目地假设您创建了一个新的虚拟方法,而没有重写PreTranslateMessage()。C++11 override关键字已过期-1用于发布不可能编译的垃圾代码。很抱歉,我打错了。唉,这仍然是无法编译的无意义代码。你还是拼错了。你到底为什么不复制/粘贴你在程序中使用的代码???对IsWindowEnabled的检查写错了。如果窗口已启用,则函数返回布尔值非零。NULL表示空指针,不应用于此目的。PreTranslate不是WinApi。这是MFC还是ATL还是什么?这个问题仅仅是草率的编码吗?