C# 在WPF MVVM应用程序中注册全局操作系统级热键

C# 在WPF MVVM应用程序中注册全局操作系统级热键,c#,wpf,vb.net,mvvm,hotkeys,C#,Wpf,Vb.net,Mvvm,Hotkeys,我试图将一些键注册为热键,这些热键不仅在全局应用程序范围内运行,而且在应用程序没有焦点时也会被捕获。我非常清楚这样做不是一个好主意,并且有足够的理由这样做 应用程序是使用MVVM编写的,主窗口甚至没有代码隐藏文件。如果我确实为此使用了代码隐藏,我将需要绑定到MainViewModel类文件中的命令,该文件用作我的MainWindow的DataContext 我已经使用代码隐藏设置了一个测试应用程序,效果非常好。但是,当我在MainViewModel中注册热键时,操作-OnHotKeyHandle

我试图将一些键注册为热键,这些热键不仅在全局应用程序范围内运行,而且在应用程序没有焦点时也会被捕获。我非常清楚这样做不是一个好主意,并且有足够的理由这样做

应用程序是使用MVVM编写的,主窗口甚至没有代码隐藏文件。如果我确实为此使用了代码隐藏,我将需要绑定到MainViewModel类文件中的命令,该文件用作我的MainWindow的DataContext

我已经使用代码隐藏设置了一个测试应用程序,效果非常好。但是,当我在MainViewModel中注册热键时,操作-OnHotKeyHandler-永远不会触发

我的精简代码如下所示。它是VB.NET,我上面链接的类是C#,因此我将其编译为C#类库,并将其设置在我的引用中。我在任何时候都不会收到任何错误消息,在真正的代码中,我不会接受异常。我的主窗口实际上绑定到这个类,调试表明它已经被实例化

Public Class MainViewModel
    Private Shared _hotKeyF4 As GlobalHotKey.HotKey

    Public Sub New()
        _hotKeyF4 = New GlobalHotKey.HotKey(Key.F4, GlobalHotKey.KeyModifier.None, OnHotKeyHandler, True)
    End Sub

    Private Function OnHotKeyHandler() As Action(Of GlobalHotKey.HotKey)
        Debug.Print("F4 was pressed") 'Never fires
    End Function
End Class
如果我不能使这个特定的类/方法工作,那没关系。我所需要的只是在WPF MVVM应用程序中全局(操作系统级)监听按键的某种方式。C#代码很好,因为我要么转换它,要么编译它,无论哪个最有意义


注意:看起来我找到了一个,但如果我选择的热键已被分配给其他对象,则抛出未处理的异常时,我遇到了一些问题。

仅与您的注意有关,如果热键已注册,您预计会发生什么?如果热键已经注册,或者您仍然想捕获它们,您不能选择其他热键吗?@Viv它不应该像现在那样使程序崩溃。作为一名开发人员,我可以进入代码并注册一个不同的密钥,但作为一名最终用户,你会被搞砸的。当然。注册热键是本机“user32.dll”中的一个函数,您可以检查它以及它在项目中的使用情况。所以你有几个选择。克隆存储库并在Register函数中以不同方式处理错误,或者使用try-catch在代码中从视图的代码中创建keybinding,或者在
行为中实现keybinding,并在那里使用try-catch处理异常。