Winapi WM_CHAR在某些程序中钩住了两次
我正在使用WH_GETMESSAGE钩子钩住WM_CHAR消息。当我在firefox窗口或代码块编辑器中输入某物时,每输入一个键,我就会得到两次WM_CHAR。然而,在chrome中,这只是一条信息。为什么?我该怎么处理呢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;
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:看起来您应该将此作为答案发布。