winapi - WM_KEYDOWN 重复计数?

标签 winapi

MSDN 文档说 LParam 前 15 位用于重复计数,但它说它不是累积的

现在除非我在这里遗漏了一些东西,为什么它称它为重复计数但说它不是累积的?

这是一个矛盾的说法?它说它可以,但它没有?或者我在这里遗漏了什么?

我实际上对其进行了测试并使用按位运算符对其进行了屏蔽,以使用 LParam&0xFFFF 提取前 15 位无论我按下多少键,该值仍为 1

除非我做错了什么或遗漏了什么,我不知道这个不算数的计数器有什么意义?或者我是否误解了某些事情并以错误的方式执行此操作,并且需要做一些事情才能使用它

拥有这个计数器会更有效和方便,这样我就不必运行所有其他代码来计算按下和按住的键的重复计数,那么是否可以使用前 15 位来完成?也许增加前 15 位?

最佳答案

让我们从 documentation 开始:

The repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the user holding down the key.



这部分比较简单。重复计数字段是按键的“按下”次数。

If the keystroke is held long enough, multiple messages are sent.



可以发送多条消息,具体取决于您的消息循环。只要按键按下,Windows 就会继续向您发送消息,因此您可以继续重复处理。

However, the repeat count is not cumulative.



重复计数不会在消息之间延续。换句话说,每条消息代表自上次处理 WM_KEYDOWN 以来的重复次数。信息。

您从未看到重复计数高于 1 的原因是您处理窗口消息的速度太快。您可以通过在 WM_KEYDOWN 中设置延迟来查看更高的数字。消息处理程序允许更多的重复排队进入下一条消息。 (在 C# 中,因为样板代码较少,但您应该能够将其翻译成您使用的任何语言。)
private const int WM_KEYDOWN = 0x0100;
protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_KEYDOWN)
    {
        System.Threading.Thread.Sleep(1000);
        this.Text = $"Keydown Count: {m.LParam.ToInt32() & 0xFF}";
    }
    base.WndProc(ref m);
}

运行此代码,我看到重复计数接近 20-30。

如果您需要重复的总数,则需要从第一个 WM_KEYDOWN 开始记录运行记录。直到 WM_KEYUP .设计使您可以在事件进入时对其进行处理。(想象一个文本框:响应性要求您在键进入时对其进行处理,而不是等到键被释放。)

关于winapi - WM_KEYDOWN 重复计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44897991/

相关文章:

c++ - 打开转义文件时出现意外行为 :///URL in IE

c++ - 如何为完成端口创建多个线程?

c# - 拦截注册表更改

c++ - 获取有关 Windows 将在 C++ 中 sleep /唤醒的通知

Python win32print 更改高级打印机选项

c++ - 如何检查编辑控件的滚动条是否在底部?

C++自定义按钮图标

c++ - 不兼容的 var 类型

c++ - 如何使用 LoadIcon 的 c++ win32 api 在 vi​​sual studio 2017 中将图标设置为 exe

c++ - 设置安全信息 : Undeclared Identifier