【问题标题】:How to detect non modifier key press combination?如何检测非修饰键组合?
【发布时间】:2012-11-15 02:10:11
【问题描述】:

我在 Delphi 中有以下问题(但它可能被视为一般编程问题)。

我想以某种方式处理多个非修饰键组合的按键事件,例如像 A+DD 这样的快捷键+FD+F+G

我知道如何使用修饰键处理快捷键,例如 CTRL+DCTRL+ALT +DALT+D,但如何检测非修饰键组合?

【问题讨论】:

  • 不,没有特定的事件处理程序,您必须手动跟踪键序列。 (顺便说一句,请不要喊)
  • 请不要在你的主题中使用属于标签的信息。标签系统在这里非常好,不需要帮助(尤其是在 SHOUTED 时)。使用标签 - 这就是它们的用途。

标签: delphi textbox keyboard-shortcuts keyboard-events onkeypress


【解决方案1】:

每个单独的按键都会生成单独的 OnKeyDownOnKeyPressOnKeyUp 事件。所以你有三个选择:

  1. 跟踪当前按下的每个键。对于您收到的每个密钥,在OnKeyDown 事件中为其设置一个标志,并在相应的OnKeyUp 事件中为其清除标志。当您收到 DOnKeyDown 事件时,检查您是否已经标记了 AFGOnKeyDownOnKeyUp 事件还会告诉您 CTRLALTSHIFT 键的状态。

  2. 使用 Win32 API GetKeyboardState()GetKeyState()GetAsyncKeyState() 函数。当您收到 DOnKeyDown 事件时,询问操作系统是否 AFG、CTRL等当前被按住。

  3. 对于某些序列,您可以使用RegisterHotKey() 并让操作系统为您跟踪密钥。当检测到注册序列时,您将收到WM_HOTKEY 消息。

【讨论】:

  • 非常感谢!我会证明你的方法,尤其是第 1 点和第 2 点!谢谢!
  • 如果有人在移动鼠标(想想笔记本电脑的触摸板——很多时候我在打字时不小心碰到它),方法#1 可能会失败。我不知道有什么可能会失败 #2。
  • @LorenPechtel:只是感兴趣。怎么会失败?单个键盘事件仍会被触发,您可以跟踪它们吗?
  • 我想我可以用标志来跟踪他们..但我没有想到 Loren 的问题,事实上如果有人会移动鼠标,方法#1 会失败..
  • @MarjanVenema:事件会发生,但如果鼠标移动,它们可能不会发生在正在寻找它们的窗口上。
猜你喜欢
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
相关资源
最近更新 更多