c# - 获取所有按下的键

标签 c# keypress keydown

我必须使用什么才能获得此刻键盘上按下的“所有键”?因为 Form.KeyPress += new EventHandler() 在充满控件时根本不会做太多事情。无论我做什么,它都不会调用它,无论是 KeyDown、KeyUp 还是其他任何东西……是的,我知道如何使用它们。

因此,如果系统中有任何函数可以检查按下的键,它会返回所用键的数组或其他东西 - 如果能指出正确的方向,我将不胜感激。

最佳答案

听起来你想查询键盘上所有键的状态。最好的函数是 Win32 API 调用 GetKeyboardState

我认为没有与该功能相当的管理良好的等效项。它的 PInvoke 代码相当简单

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetKeyboardState(byte [] lpKeyState);

var array = new byte[256];
GetKeyboardState(array);

这将使用系统中每个虚拟键的打开/关闭状态填充 byte[]。如果设置了高位,则当前按下了虚拟键。将 Key 映射到虚拟键代码只需考虑数字 Key 值的 byte 部分即可。

public static byte GetVirtualKeyCode(Key key) {
  int value = (int)key;
  return (byte)(value & 0xFF);
}

以上适用于大多数 Key 值,但您需要小心修饰键。值 Keys.AltKeys.ControlKeys.Shift 在这里不起作用,因为它们在技术上是修饰符而不是键值。要使用修饰符,您需要使用实际关联的键值 Keys.ControlKeyKeys.LShiftKey 等...(实际上以 Key 结尾的任何内容)

因此检查是否设置了特定键可以按如下方式完成

var code = GetVirtualKeyCode(Key.A);
if ((array[code] & 0x80) != 0) {
  // It's pressed
} else { 
  // It's not pressed
}

关于c# - 获取所有按下的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10484085/

相关文章:

c# - 如何将细节模型从 Controller 传递到 View

javascript - 用于 secret 入口链接的按键组合

ruby - 暂停 "until"循环并等待按键继续 (Ruby)

c++ - 为什么 OnKeyDown 不捕获基于对话框的 MFC 项目中的按键事件?

c# - 使用 mvc 2010 在 SQL Server 中上传/下载 pdf 文件

c# - 为什么 EntLib 缓存应用程序 block 使用了错误的配置文件

javascript - 试图阻止 kendoComboBox 的箭头键输入

c# - 获取 Control.KeyDown 上的字符?

c# - 结束 else if 语句 C#

javascript - 捕获 div 内的按键,该 div 内有一个对象标签