【问题标题】:How to detect NumLock on/off status in WPF如何检测 WPF 中的 NumLock 开/关状态
【发布时间】:2015-04-21 14:47:47
【问题描述】:

当我的应用程序打开时,最初它可以检测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;     
}

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

更新

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

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;
        }
    }

【问题讨论】:

标签: c# wpf


【解决方案1】:

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

【讨论】:

  • 在我看来,他在执行操作之前不需要帮助确定当前 NumLock 值是多少,他希望在 NumLock 值更改时收到通知,以便他可以更新他的 GUI。
【解决方案2】:

所以 bool 是值类型,而不是引用类型。当您将 IsKeyToggled 的值分配给值类型时,您将获得该值。如果该值随后更改,您的本地 bool 变量将不知道。

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

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

【讨论】:

    【解决方案3】:

    这是我的解决方案:

    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;
                }
            }
    

    【讨论】:

      【解决方案4】:

      如果我理解您的问题,您希望在 NumLock 状态更改时收到通知。

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

      有人发布了代码here 的链接,正如Wai Ha Lee 所说,这里有一篇文章叫做"Low-Level Keyboard Hook in C#"

      话虽如此,这对于创建全局挂钩非常侵入性和性能敏感。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-23
        • 2017-10-28
        相关资源
        最近更新 更多