Winapi 如何使用缓冲处理窗口消息

Winapi 如何使用缓冲处理窗口消息,winapi,hook,barcode-scanner,Winapi,Hook,Barcode Scanner,我有一个WH_GETMESSAGE钩子,它可以捕获WM_KEYDOWN和WM_输入(现在只有WM_KEYDOWN),我需要的是一种方法来测量WM_KEYDOWN之间的时间间隔,以查看用户键入的速度。确切地说,如果输入太快,我需要删除整个按键(即,输入实际上不是来自用户,而是来自一些HID键盘设备,如条形码扫描仪)。我需要做的是,对于每个符号,我要等待30毫秒,然后如果没有其他符号应用,我需要将它发送到窗口,这是它的本意。需要在每个WM_键下执行该检查。如果应用了新符号,我会将其与任何其他符号一起

我有一个WH_GETMESSAGE钩子,它可以捕获WM_KEYDOWN和WM_输入(现在只有WM_KEYDOWN),我需要的是一种方法来测量WM_KEYDOWN之间的时间间隔,以查看用户键入的速度。确切地说,如果输入太快,我需要删除整个按键(即,输入实际上不是来自用户,而是来自一些HID键盘设备,如条形码扫描仪)。我需要做的是,对于每个符号,我要等待30毫秒,然后如果没有其他符号应用,我需要将它发送到窗口,这是它的本意。需要在每个WM_键下执行该检查。如果应用了新符号,我会将其与任何其他符号一起推送到我的队列中,这些符号在消息之间的时间限制为30毫秒(实际上,我在我的计算机上进行了测试,输入符号需要31-32毫秒,条形码扫描仪需要15-16毫秒,这就足够了)

我想出了以下算法: 1.如果传入的消息是WM_KEYDOWN-存储它(时间不正常)。 2.如果下一条传入消息不是WM_KEYDOWN或超出时间限制-将存储的消息发送给其收件人,如果是WM_KEYDOWN,则存储当前消息-转至步骤1。 3.如果下一条消息在30毫秒内到达,请将其保存。 4.如果下一条消息是VK_RETURN或序列长度超过128个符号,则删除当前序列并将其存储为条形码。转到第1步

该算法当前的缺陷是sendMessage。我使用了sendMessage和postMessage,但它们都只是将其重新发送到我的钩子过程(我想这很明显)。有没有办法直接把这条信息发送到门托要发送的窗口

或者我的问题还有其他解决办法

我的解释可能模棱两可,所以我只写下我需要达到的目标: 我需要截获条形码扫描仪的输入,在它真正到达窗口程序之前,所以扫描仪的WM_键控消息不会到达目标窗口。条形码消息通常在单个WM_键控之间间隔15-16ms,并以VK_返回结束


此外,我还需要使用WH_GETMESSAGE(或类似的钩子,它将允许我捕获WM_输入和WM_KEYDOWN)。WM_输入需要区分不同设备的输入(基本上,我将枚举所有HID键盘,确定其中哪个键盘发送条形码。如果发生此类事件,我将将设备标记为条形码扫描仪,并将其VID&PID存储到本地数据库,并将其用于其他设备)

GetMessage
太晚了。如果您尝试重放输入,则移位状态将不同步。使用低级键盘挂钩并使用SendInput重播可能会更幸运。(您可以使用
LLKHF_INJECTED
标志来避免递归问题。)我没有这个机会,因为键盘的工作级别低于RawInput,所以它的消息发送时间早于WM_INPUT,我无法比较两者,因此无法丢弃不需要的键盘输入。现在我将自己调用WndProc并等待它处理消息,我希望它不会试图在完成后调用DefWindowProc。