You need to enable JavaScript to run this app. C#中System.Windows.Input.Key无法使用导致键盘方法调用失败如何解决
优惠活动
大模型
产品
解决方案
定价
更多

C#中System.Windows.Input.Key无法使用导致键盘方法调用失败如何解决

问题修复方案

问题根源

System.Windows.Input.Key枚举和Keyboard类属于WPF框架的专属组件,绑定PresentationCore程序集,项目未正确引用该程序集、或者项目类型非WPF项目时,就会出现Key枚举无法识别的问题。

解决方案

情况1:项目为WPF项目

  • 右键项目 → 选择「管理NuGet程序包」,搜索安装PresentationCore包即可。
  • 如果你使用的是.NET Framework版本的WPF,也可以右键项目→「添加」→「引用」→ 勾选程序集列表中的PresentationCore确认即可。
    引用完成后即可正常使用Key枚举。

情况2:项目为非WPF项目(控制台/WinForms/.NET通用项目等)

不建议强制引用WPF的PresentationCore,脱离WPF上下文使用Keyboard类可能出现未知异常,推荐用Win32原生API实现按键检测,替换后的代码如下:

using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;

namespace rubicksTimer
{
    public class Timer
    {
        // 导入Win32按键状态检测API
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        private static extern short GetKeyState(int keyCode);
        // 空格对应的虚拟键码
        private const int VK_SPACE = 0x20;

        public static double SolveTimer ()
        {
            Stopwatch sw = new Stopwatch();

            // 等待第一次按下空格
            while (GetKeyState(VK_SPACE) >= 0)
            {
                Thread.Sleep(10); // 降低CPU占用
            }
            
            // 等待松开空格
            while (GetKeyState(VK_SPACE) < 0)
            {
                Thread.Sleep(10);
            }
            
            sw.Start();

            // 等待第二次按下空格停止计时
            while (GetKeyState(VK_SPACE) >= 0)
            {
                Thread.Sleep(10);
            }

            sw.Stop();

            return (double)sw.ElapsedMilliseconds / 1000;
        }
    }
}

额外优化说明

  • 原代码中的空循环会占满单个CPU核心,添加Thread.Sleep(10)后可将CPU占用降到几乎为0,不会影响计时精度。
  • 如果你需要检测其他按键,可直接替换VK_SPACE的常量值为对应虚拟键码即可。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 19:36:02