2012-08-22 181 views

回答

7
public static IEnumerable<Key> KeysDown() 
{ 
    foreach (Key key in Enum.GetValues(typeof(Key))) 
    { 
     if (Keyboard.IsKeyDown(key)) 
      yield return key; 
    } 
} 

然后你可以这样做:

if(KeysDown().Any()) //... 
2

遍历System.Windows.Input.Key枚举值。

public static bool IsAnyKeyDown() 
    { 
     var values = Enum.GetValues(typeof(Key)); 

     foreach (var v in values) 
     { 
      if (((Key)v) != Key.None) 
      { 
       if (Keyboard.IsKeyDown((Key)v)) 
       { 
        return true; 
       } 
      } 
     } 

     return false; 
    } 
1

好这里的答案...得到集中的所有keystates的一次使用GetKeyboardState()

以上是检查键盘的实时状态。

如果您依赖挂钩事件直到KeyDown/KeyUp事件来跟踪键盘的状态......那么这可能不太准确。

这是因为你依靠消息泵来处理和分发那些KeyDown/KeyUp消息......它们可能在真正的键盘状态再次发生变化后被传递。

此外,因为当你对键盘状态感兴趣的代码位正在运行时(通常在UI线程上)... KeyDown或KeyUp无法打断你......因为它们是在UI线程上分派的太...这就是为什么使用GetKeyBoardState()Keyboard.IsKeyDown应该使用。

(上面是假设你要和关心生活状态)

+0

确实很好的答案 –

4

如果你想检测关键只在我们的应用程序按下(当你的WPF窗口被激活)添加KeyDown如下:

public MainWindow() 
{ 
    InitializeComponent(); 
    this.KeyDown += new KeyEventHandler(MainWindow_KeyDown); 
} 

void MainWindow_KeyDown(object sender, KeyEventArgs e) 
{ 
    MessageBox.Show("You pressed a keyboard key."); 
} 

如果你想要德当一个按键被按下时,即使你的WPF窗口没有被激活,也会稍微困难一点,但是可以。我从Windows API推荐RegisterHotKey(定义系统范围的热键)和UnregisterHotKey。尝试在C#使用这些从pinvoke.net或这些教程:

Thse是在Microsoft Forums样品。你可以使用Virtual-Key Codes。 我希望我很清楚,你会理解我的答案。

相关问题