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