You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用SharpDX C#获取按键扫描码与精准按键名称的技术问询

用SharpDX获取精准键盘按键名称与扫描码方案

嘿,我对SharpDX处理输入这块挺熟悉的,你的需求完全可以实现!咱们直接针对问题来解决:

一、获取键盘精准按键名称(如'B'、'F1')

你之前拿到的Button1Button49这类名称,是因为代码把键盘当成了通用游戏控制器(比如用了Joystick类),而没有直接使用SharpDX专为键盘设计的Keyboard类。

切换到Keyboard类后,我们可以直接用SharpDX内置的Key枚举,它对应了所有键盘按键的精准名称,比如Key.BKey.F1Key.LeftShift等。通过Key.ToString()就能直接得到你需要的友好名称。

二、获取按键扫描码

SharpDX的键盘输入数据结构里直接包含了扫描码信息,不管是缓冲输入还是即时状态都能拿到。

完整代码示例

下面是一个简单的实现,演示如何同时获取精准按键名和扫描码:

using SharpDX.DirectInput;

// 初始化DirectInput和键盘设备
var directInput = new DirectInput();
var keyboardDevice = new Keyboard(directInput);

// 设置缓冲大小,用于捕获按键序列
keyboardDevice.Properties.BufferSize = 128;
// 激活键盘设备
keyboardDevice.Acquire();

Console.WriteLine("正在监听键盘输入...按ESC退出");

while (true)
{
    // 获取缓冲的输入数据
    var inputData = keyboardDevice.GetBufferedData();
    
    foreach (var data in inputData)
    {
        // 获取精准按键名称
        string keyName = data.Key.ToString();
        // 获取硬件扫描码
        int scanCode = data.ScanCode;
        // 判断按键状态(按下/释放)
        bool isPressed = data.IsPressed;

        Console.WriteLine($"按键: {keyName} | 扫描码: {scanCode} | 状态: {(isPressed ? "按下" : "释放")}");

        // 按下ESC退出循环
        if (data.Key == Key.Escape && isPressed)
        {
            keyboardDevice.Unacquire();
            return;
        }
    }

    // 短暂休眠,避免占用过高CPU
    System.Threading.Thread.Sleep(10);
}

关键细节说明

  • 不要用通用控制器类:如果继续用Joystick处理键盘输入,只能拿到通用的Button编号,而无法获取精准按键名和扫描码,一定要切换到Keyboard类。
  • 扫描码类型:示例中拿到的ScanCode是硬件扫描码(Set 1),这是Windows系统中最常用的扫描码格式,符合大多数场景需求。
  • 特殊按键处理:对于多媒体按键(如音量加减、播放暂停),Key枚举也有对应的成员(比如Key.VolumeUp),同样可以直接获取名称和扫描码。

如果是游戏手柄的按键处理,SharpDX的Gamepad类也提供了GamepadButtonFlags枚举,能拿到ABX这类精准手柄按键名,扫描码同样可以通过手柄输入数据获取~

内容的提问来源于stack exchange,提问作者Inside Man

火山引擎 最新活动