【问题标题】:Win32 Keyboard managing when key released while not focusedWin32键盘在未聚焦时释放键时管理
【发布时间】:2017-05-09 08:21:30
【问题描述】:

我有一个输入管理器,可以通过消息很好地跟踪键盘状态

WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP

所以我知道什么时候按下左键。 但是,如果窗口失去焦点并且在再次获得焦点之前释放了键,则不会出现“键释放”消息。

这似乎是每个人都经常遇到的一个非常尴尬的问题,所以我觉得我错过了一些东西。现在我有一个修复程序,当窗口获得焦点时只使用GetKeyboardState。但感觉这有点矫枉过正。

现在我还看到有一个“LowLevelKeyboardProc”,它可以通过简单地始终检测键来帮助解决这个问题。但是从名字上就感觉使用它有一些缺点(比如减慢所有应用程序的所有输入?)。

我还缺少其他解决方案吗?如果没有,这两种方法中哪一种更好?

【问题讨论】:

  • "所以我知道什么时候按下左键" - 你不需要自定义输入管理器,只需使用 Get(Async)KeyState() 代替。
  • (比如减慢所有应用的所有输入速度?):没有人打字那么快 BTW ;-)
  • @remy 'GetAsyncKeystate()' 似乎是程序上下文中的工作。是否有可能给 2 个不同的线程独立访问权限?就像线程 A 调用它时一样,A(并且只有 A)的最后一次调用算作最后一次调用。

标签: c++ windows winapi keyboard-events


【解决方案1】:

您需要查找 SetWindowsHookEx 的 MSDN 文档。基本上你需要做的是使用这个函数和一个回调过程(这是你的应用程序的一部分),当键状态改变时运行。

【讨论】:

  • Raw Input API 通常比SetWindowHookEx() 更受欢迎。 Even MSDN says so: "在大多数情况下,应用程序需要使用低级钩子,它应该监视原始输入。这是因为原始输入可以异步监视针对其他线程的鼠标和键盘消息,而不是低级更有效水平挂钩可以。"
猜你喜欢
  • 2019-06-16
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 2016-05-04
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多