2010-12-01 43 views
4

J'ai une application WPF (prism) qui utilise beaucoup d'autres assemblys WPF et même des win32 win32 contenant d'autres fenêtres (wpf et win32).Définir une touche de raccourci pour l'application dans une application mixte wpf/win32

Lorsque l'utilisateur appuie sur une touche de fonction (F2-F12), je souhaite ouvrir des fonctions de programme spéciales.

Quelque chose comme ceci:

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

Le problème est: cela ne fonctionne que lorsque le MainWindow a le focus. Si j'ouvre une fenêtre WPF secondaire (ou une fenêtre win32) le raccourci clavier ne s'applique plus.

Existe-t-il un moyen d'ajouter une touche de raccourci global à l'échelle de l'application pour F4 (ou une autre clé)?
Ou au moins une touche de raccourci WPF?

+0

[Entrée focus ne peut être sur une fenêtre à aucun moment] (http://msdn.microsoft.com/en-us/library/ms754010.aspx#focus). Vous pouvez essayer d'attraper le raccourci clavier dans la fenêtre secondaire et utiliser [messagerie] (http://www.google.com/search?q=mvvm+messaging) pour communiquer à MainWindow que la touche a été enfoncée. Win32 fenêtre peut nécessiter des crochets de clavier de niveau inférieur et le tri. –

Répondre

3

Vous pouvez essayer je pense d'écrire un crochet au clavier et attaché ce crochet pour écouter les messages du clavier du fil de votre application.

Ceci est vraiment un bon exemple d'inspiration: http://www.codeproject.com/KB/cs/globalhook.aspx.

prendre Juste une note que si vous utilisez .Net 4.0 puis quand vous utiliserez SetWindowsHookEx au lieu d'utiliser

Assembly.GetExecutingAssembly().GetModules()[0] 

comme hMod param, utilisez:

Process.GetCurrentProcess().MainModule.BaseAddress 
+1

Ahh, viens de remarquer qu'une question a un an :) – PompolutZ