Winapi WM_CHAR在某些程序中钩住了两次

Winapi WM_CHAR在某些程序中钩住了两次,winapi,keyboard-hook,Winapi,Keyboard Hook,我正在使用WH_GETMESSAGE钩子钩住WM_CHAR消息。当我在firefox窗口或代码块编辑器中输入某物时,每输入一个键,我就会得到两次WM_CHAR。然而,在chrome中,这只是一条信息。为什么?我该怎么处理呢 LRESULT CALLBACK Proc(int code, WPARAM wParam, LPARAM lParam) { if(code >= HC_ACTION) { MSG* msg=(MSG *)lParam;

我正在使用WH_GETMESSAGE钩子钩住WM_CHAR消息。当我在firefox窗口或代码块编辑器中输入某物时,每输入一个键,我就会得到两次WM_CHAR。然而,在chrome中,这只是一条信息。为什么?我该怎么处理呢

LRESULT CALLBACK Proc(int code, WPARAM wParam, LPARAM lParam)
{
    if(code >= HC_ACTION)
    {
        MSG* msg=(MSG *)lParam;
        if(msg->message==WM_CHAR)
        {
            MessageBox(0, 0, 0, 0);
        }
    }
    return CallNextHookEx(hHook, code, wParam, lParam);
}

为什么
=
而不是
=
?为什么
MessageBox
?那一定会把事情搞砸的。使用
OutputDebugString
或其他一些良性的日志记录机制将>=替换为==未更改任何内容。MessageBox,因为它在dll中,我无法轻松使用printf()。OutputDebugString在代码块中不适用于我。但是,呃,说真的,MessageBox不是我唯一要检查的东西。如果%2==0,我使用的某个变量会更改键入的键。我在收到的每一个WM_字符中递增它。在Chrome中,我必须键入两个键才能更改密钥,而在CB中只有一个。没关系,听起来你知道的比我多。Firefox/CodeBlocks似乎在实际从队列中删除消息之前调用了
PeekMessage(…,PM_NOREMOVE)
。您可以通过计算
wParam
(请参阅)来验证消息是否已从队列中删除。根据您的需要,a可能更合适。@IInspectable:看起来您应该将此作为答案发布。