在WPF中检测用户按下F10键

20

我开发的WPF应用程序需要通过函数键(F1-F12)来触发行为。

我的代码大致如下:

private void Window_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.Key)
    {
        case Key.F1:
        ...
        case Key.F2:
        ...
    }
}

这对于除了F10之外的所有F键都有效。调试时,我发现当用户按下F10键时,e.Key == Key.System

在枚举定义中,F10 = 99System = 156,所以我可以排除它是重复的枚举值(例如PageDown = Next = 20)。

那么,如何判断用户何时按下F10

检查Key.System是否安全?这感觉有点不好 - 是否可能Key.System会因为按下其他键而产生?或者是不是有某个设置可以使F10报告为Key.F10

4个回答

21

除了Yacoder的回答之外,使用以下内容来检查F10键:

case Key.System:
  if (e.SystemKey == Key.F10)
  {
    // logic...
  }

通过 SystemKey 属性,可以知道哪个系统键被按下了。


很酷。我发现当e.Key == Key.System时,我也需要设置e.Handled = true,以确保焦点不会停留在控制框上。(由于我使用了WindowStyle = None,所以我的应用程序中的控制框是不可见的,这使得默认的F10行为对用户来说更加困惑。)此外,当用户按下Alt键时,e.Key == Key.System也成立 - 也许在其他一些情况下也是如此 - 所以使用e.SystemKey绝对是正确的方式,而不仅仅假设它是F10。谢谢! - teedyay

4

1

使用 DataContext 进行回答:



    public partial class BankView : UserControl
    {
        public BankView()
        {
            InitializeComponent();
this.KeyDown += new KeyEventHandler(BankView_KeyDown); }
private void BankView_KeyDown(object sender, KeyEventArgs e) { try { switch (e.Key) { case Key.F4: ((BankViewModel)DataContext).OpenAccount(); break; } } catch (Exception ex) { ... } }


-2

这对我有用,对于F1

Private Sub Window_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    If (e.Key = Key.F1) Then
        ShowHelp()
    End If
End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接