如何在WPF中检测NumLock的开/关状态

时间:2015-04-21 14:47:47

标签: c# wpf

当我的应用程序打开时,最初它可以检测numlock是打开还是关闭,但是当我打开或关闭numlock时,仍然打开应用程序,numlock状态仍然与初始状态保持相同。这是我的代码:

bool isNumLockedPressed = System.Windows.Input.Keyboard.IsKeyToggled(System.Windows.Input.Key.NumLock);


public MainWindow()
{
            if (isNumLockedPressed == true)                
                NumLock.Foreground = System.Windows.Media.Brushes.White;

            else
                NumLock.Foreground = System.Windows.Media.Brushes.Red;     
}

我希望numlock状态跟随我的开/关操作。有什么建议吗?

已更新

这是我到目前为止的修改,但仍然无法得到我想要的东西。有什么建议吗?

bool isNumLockedPressed = System.Windows.Input.Keyboard.IsKeyToggled(System.Windows.Input.Key.NumLock);

int numLockStatus { get; set; }

public MainWindow()
{
            if (isNumLockedPressed == true)
            {
                numLockStatus = 1;
                NumLock.Foreground = System.Windows.Media.Brushes.White;
            }

            else
            {
                numLockStatus = 0;
                NumLock.Foreground = System.Windows.Media.Brushes.Red;
            }

}   

 private void NumLockKey_Press(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.NumLock)
        {
            numLockStatus = 1;
            NumLock.Foreground = System.Windows.Media.Brushes.White;
        }

        else
        {
            numLockStatus = 0;
            NumLock.Foreground = System.Windows.Media.Brushes.Red;
        }
    }

4 个答案:

答案 0 :(得分:2)

您正在调用函数并将结果存储在isNumLockedPressed中。 isNumLockedPressed的值永远不会改变,除非您有明确更改它的代码。如果您希望稍后在代码中使用最新值更新它,只需重复函数调用,然后再检查值isNumLockedPressed = System.Windows.Input.Keyboard.IsKeyToggled(System.Windows.Input.Key.NumLock);

答案 1 :(得分:2)

因此bool是值类型,而不是引用类型。将IsKeyToggled的值分配给值类型时,您将获得此时的值。如果值随后更改,则您的本地bool变量将不会知道它。

您应该做的是创建一个带有静态方法/属性的实用程序/辅助类。

public class KeyboardHelper 
{
    public bool IsNumLockPressed
    {
        get { return System.Windows.Input.Keyboard.IsKeyToggled(System.Windows.Input.Key.NumLock); }
    }
}

答案 2 :(得分:0)

如果我理解您的问题,您希望在NumLock状态发生变化时收到通知。

要做到这一点,你需要一个全局键盘钩子。这样,即使您的应用程序没有键盘焦点,每次按下键时都会收到通知。然后,您可以在回调中对其作出反应。

有人发布了代码here的链接,而Wai Ha Lee提到这里有一篇名为"Low-Level Keyboard Hook in C#"的文章。

话虽这么说,但非常侵入性和对创建全局钩子的性能敏感。

答案 3 :(得分:0)

这是我的解决方案:

bool isNumLockedPressed = System.Windows.Input.Keyboard.IsKeyToggled(System.Windows.Input.Key.NumLock);

int numLockStatus { get; set; }

public MainWindow()
{
            if (isNumLockedPressed == true)
            {
                numLockStatus = 1;
                NumLock.Foreground = System.Windows.Media.Brushes.White;
            }

            else
            {
                numLockStatus = 0;
                NumLock.Foreground = System.Windows.Media.Brushes.Red;
            }

}   

private void NumLockKey_Press(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.NumLock && e.IsToggled)
            {
                numLockStatus = 1;
                NumLock.Foreground = System.Windows.Media.Brushes.White;
            }

            else if (e.Key == Key.NumLock && e.IsToggled == false)
            {
                numLockStatus = 0;
                NumLock.Foreground = System.Windows.Media.Brushes.Red;
            }
        }