- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试从我自己的 InputBox 的 WM_KEYDOWN 和 WM_CHAR 消息中获取键盘输入。
这是我用于基本输入的代码,它适用于字符:
if(msg.message == WM_KEYDOWN)
{
keyHandled = false;
//handle other keys here, e.g. VK_LEFT
}
else if(msg.message == WM_CHAR && !keyHandled)
{
keyHandled = true;
gui->UpdateInput(msg.wParam);
}
如果按下的键也是触发WM_CHAR消息的键,则间隔与通常的输入框相同。
但是,如果它是像 VK_LEFT 这样的键,它会继续接收 WM_KEYDOWN 消息,不会有任何延迟。
有什么方法可以让我以相同的时间间隔接收所有 key ,或者我是否必须实现一个计时器来处理消息之间的延迟?我也看过 WM_KEYDOWN message在 msdn 上,但我找不到与间隔相关的任何内容。
最佳答案
Windows 在从键盘输入发送键盘事件时有其自身的延迟,这不是您可以简单更改的。如您所知,按住一个键会产生第一条消息、延迟,然后是间隔更快的一系列更多消息。您可以通过请求状态而不是直接依赖消息来解决这个问题。这称为无缓冲 输入并且是面向状态 的。要存储您的状态,您可以执行以下操作:
bool keys[256];
当您检查 Windows 事件时,您可以像这样相应地更新键状态:
//In your WinProc function most likely
if (msg.message == WM_KEYDOWN)
{
keys[msg.wParam] = true;
}
if (msg.message == WM_KEYUP)
{
keys[msg.wParam] = false;
}
然后,只要您愿意,就可以通过以下函数请求特定键的状态:
bool getKeyPressed(char keycode)
{
return keys[keycode];
}
例如:
//This could be in some random update function and called
//whenever you need the information.
if (getKeyPressed(VK_UP))
{
//Do something here...
}
上述功能可以在任何您喜欢的地方使用,因此您更新的频率完全取决于您。如前所述,这是无缓冲输入并且是状态导向的,而缓冲输入是事件导向的。 p>
关于C++ WM_KEYDOWN 不同的间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17881369/
MSDN 文档说 LParam 前 15 位用于重复计数,但它说它不是累积的 现在除非我在这里遗漏了一些东西,为什么它称它为重复计数但说它不是累积的? 这是一个矛盾的说法?它说它可以,但它没有?或者我
这个问题在这里已经有了答案: Keyboard Input & the Win32 message loop (2 个答案) 关闭 8 年前。 我正在尝试做一个非常简单的任务——当按下一个键时发生一
我目前正在尝试从我自己的 InputBox 的 WM_KEYDOWN 和 WM_CHAR 消息中获取键盘输入。 这是我用于基本输入的代码,它适用于字符: if(msg.message == WM_
我使用 WM_KEYDOWN/WM_KEYUP 定义了一些函数来处理输入,但似乎只有 WM_KEYUP 可以正常工作。当使用利用 WM_KEYDOWN 的函数时,什么也没有发生。 (不显示调试消息)
我有一个窗口可以创建许多其他常用控件,例如菜单、带有按钮和组合框的工具栏以及状态栏。问题是每当我按 Enter 或 Esc 时窗口都不会收到 WM_KEYDOWN 消息,但我需要处理这些消息。是否有任
我试图让我的应用程序在按下 CTRL+S 时执行某些操作。我只是不确定 W 和 L 参数如何为 WM_KEYDOWN 工作。 MSDN 有一些关于位域的内容,我不确定。如何检测 CTRL 和 S?谢谢
我一直在尝试找出程序中的错误。我注意到,每当我按住向上和向左箭头键并按空格键时,我的 WndProc 永远不会接收或处理 WM_KEYDOWN 消息以及 WPARAM 为 VK_SPACE。 我有点好
我试图让我的程序在按下 shift 键时切换 bool 值。但是,出于某种原因,它似乎没有收到消息,因为我已经将 MessageBoxes 放在 KEYDOWN 和 KEYUP 的情况下,并且它们没有
这是一个相当不寻常的问题,但我需要一些关于 Win32 究竟如何处理不同的按键事件的解释。 WM_KEYDOWN 当您想要接收长按时使用,例如如果您在游戏中,并且想要前进,请按向上箭头键或“W”键
我正在尝试通过 PostMessage 向一个应用程序发送击键。我正在使用 Spy++ 来尝试了解如何发送消息,因为我不完全了解其内部工作原理。 在这张图片中,第一个项目(选中的项目)是用我自己实际击
我正在尝试编写一个可以读取条码扫描仪的程序。此外,即使应用程序不是焦点窗口(即在系统托盘中运行等),我也需要它来读取输入。 我找到了这篇标题为 Distinguishing Barcode Scann
我有这个代码: public static void Next() { Process[] processes = Process.GetProcessesByName
win32 中是否有一个函数可以获取 CTRL、ALT 或大写锁定键的虚拟键代码并返回一个字符串“CTRL”、“ALT”、“CAPSLOCK”? 我只能接收 WM_KEYDOWN 消息,不能接收 WM
我正在编写一个可以将击键发送到另一个应用程序的应用程序。当我硬编码要发送的文本时,我有一些工作。但是,当我使用 argv[] 从参数列表中获取文本时,它不再发送文本,而是发送数字或什么都不显示。我认为
我需要有关 WM_KEYDOWN 的帮助,我想消除第一次按键和重复按键之间的“暂停”。 如果你持续按住一个按钮,我希望程序直接实现它。 我正在尝试使用 directx 制作游戏。请告诉我是否应该使用
如果 WM_KEYDOWN 有一个 messagebox() 以便理解这个案例的功能。 谁能帮我看看为什么这个case没 react ? 我正在尝试调试这个,同时我从键盘和调试器插入一些字母,但没有出
Win32 应用程序如何只响应第一个 WM_KEYDOWN 通知? MSDN 文档声称第 30 位“指定先前的 key 状态。如果在发送消息之前 key 已关闭,则值为 1,如果 key 已启动,则值
我刚开始MFC编程,之前没有做过任何UI设计和编程。我想知道为什么假设键盘正常工作,当每个被按下的键肯定会被释放时,Windows 会生成两条消息 WM_KEYUP 和 WM_KEYDOWN。 我认为
我在编辑框中处理 WM_KEYDOWN 消息。 我正在处理一堆键,但对于某些键(例如选项卡),我想阻止可显示字符附加到编辑框。 case WM_KEYDOWN: { switc
public class sendKeys { [DllImport("user32.dll")] public static extern IntPtr FindWindow(str
我是一名优秀的程序员,十分优秀!