在混合的WPF/win32应用程序中定义全局热键

4

我有一个 WPF(prism)应用程序,它使用了许多其他的 WPF 组件和甚至包含其他窗口的 win32 dlls(wpf 和 win32)。

当用户按下功能键(F2-F12)时,我想要打开特定的程序功能。

类似于这样:

RoutedCommand commandF4 = new RoutedCommand();
commandF4.InputGestures.Add(new KeyGesture(Key.F4));
Application.Current.MainWindow.CommandBindings.Add(new CommandBinding(commandF4, CallCommandF4));

问题是:只有MainWindow具有焦点时,这才有效。如果我打开一个次要的WPF窗口(或win32窗口),则键绑定不再适用。
是否有任何方法为F4(或其他键)添加应用程序范围的全局热键? 或至少是WPF范围的热键?

在任何时刻,输入焦点只能在一个窗口上。您可以尝试在辅助窗口中捕获键绑定,并使用消息传递与MainWindow通信按下了该键。Win32窗口可能需要更低级别的键盘钩子等操作。 - Jake Berger
1个回答

3
你可以尝试编写一个钩子来监听你的应用程序线程中的键盘消息。这是一个很好的灵感示例:http://www.codeproject.com/KB/cs/globalhook.aspx。请注意,如果你使用的是 .Net 4.0,则应该使用 SetWindowsHookEx 而不是使用。
Assembly.GetExecutingAssembly().GetModules()[0]

作为hMod参数,使用如下:
Process.GetCurrentProcess().MainModule.BaseAddress

1
啊,刚注意到这个问题已经一年了 :) - fxdxpz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接