组合键快捷键

问题描述:

我创建了一个WPF应用程序,我有三个窗口(MainWindow, SecondWindow and CameraWindow)。我添加了快捷方式("m")将相机设置为图像模式。当CameraWindow处于活动状态时,此功能正常工作。组合键快捷键

private void Window_KeyDown(object sender, KeyEventArgs e) 
{ 
    var key = e.Key.ToString().ToLower(); 
    if (key.Contains("m")) 
    {    
     camera.SetImageMode();     
    } 
} 

我正在寻找在我的应用程序的任何位置将相机设置为图像模式的方式。我的意思是我应该能够将相机设置为图像模式,即使CameraWindow处于未激活状态。可以是关键组合。

任何建议,欢迎!

+0

如果您想遵守MVVM,您可能需要分别在视图模型和视图上使用'ICommand's和'CommandBinding'引用。在你的情况下,你可能需要在'Window.InputBindings'上使用'KeyBinding'。 – Adwaenyth

+0

@Adwaenyth感谢您的评论。你能否展示/链接我一个这样做的例子,因为我在wpf方面很新颖...... – TestMan

+0

取决于你知道多少,或者更确切地说,你还不知道多少,这可能会让你放弃很长时间。但是,您可能想从[这里]开始(https://stackoverflow.com/questions/24304969/how-to-bind-keyboard-input-command-to-main-window)。 – Adwaenyth

后长时间搜索和实验,终于找到了解决方案 https://stackoverflow.com/a/12676910/8152725

public class KeyboardHandler : IDisposable 
    { 
     private readonly int _modKey; 
     private const int WmHotkey = 0x0312; 
     private readonly WindowInteropHelper _host; 

     [DllImport("user32.dll")] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc); 

     [DllImport("user32.dll")] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     private static extern bool UnregisterHotKey(IntPtr hWnd, int id); 


     private readonly ISubject<Unit> _hotKeyHandleSubject = new Subject<Unit>(); 
     public IObservable<Unit> WhenHotKeyHandled { get { return _hotKeyHandleSubject.AsObservable(); } } 

     /// <summary> 
     /// 
     /// </summary> 
     /// <param name="mainWindow">the handle to the main window</param> 
     /// <param name="vkKey">the virtual key you need to press -> https://msdn.microsoft.com/en-us/library/ms927178.aspx </param> 
     /// <param name="modKey">the modifier key you need to press (2 is CTRL by Default) -> https://msdn.microsoft.com/it-it/library/windows/desktop/ms646279(v=vs.85).aspx </param> 
     public KeyboardHandler(Window mainWindow, int vkKey, int modKey = 2) 
     { 
      _modKey = modKey; 
      _host = new WindowInteropHelper(mainWindow); 

      SetupHotKey(_host.Handle, vkKey); 
      ComponentDispatcher.ThreadPreprocessMessage += ComponentDispatcher_ThreadPreprocessMessage; 
     } 

     private void ComponentDispatcher_ThreadPreprocessMessage(ref MSG msg, ref bool handled) 
     { 
      if (msg.message == WmHotkey) 
      { 
       _hotKeyHandleSubject.OnNext(Unit.Default); 
      } 
     } 

     private void SetupHotKey(IntPtr handle, int vkKey) 
     { 
      RegisterHotKey(handle, GetType().GetHashCode(), _modKey, vkKey); 
     } 

     public void Dispose() 
     { 
      ComponentDispatcher.ThreadPreprocessMessage -= ComponentDispatcher_ThreadPreprocessMessage; 
      UnregisterHotKey(_host.Handle, GetType().GetHashCode()); 
     } 
    } 

使用这样的:

_keyboardHandler = new KeyboardHandler(this, 0x4D); 
      _disposable = _keyboardHandler.WhenHotKeyHandled.ObserveOn(SynchronizationContext.Current).Subscribe(_ => 
      { 
       TextBlock.Text += new Random().Next(10) + "_"; 
      }); 

荣誉给https://stackoverflow.com/a/1960122/2159837,我只是修改了一点

这工作也如果应用程序没有焦点