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
相关产品推荐
相关产品推荐

