2009-12-28 3 views
1

J'ai besoin de mon application WPF pour faire la mise au point à chaque fois que l'utilisateur appuie sur "touche + s".Global KeyHook dans l'application WPF

Ma solution était d'accrocher à l'événement de clavier avec SetWindowsHookEx. mais la poignée que je reçois en retour est toujours 0. quand je l'appelle à GetLastWin32Error la valeur est 0 (il signale en fait que l'opération précédente a réussi)

_hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, _hookFunction, _hinstance, 0); 
if (_hookHandle == IntPtr.Zero) 
throw new Win32Exception(Marshal.GetLastWin32Error()); 

(Il va sans dire que _hinstance a une validité valeur et ainsi _hookFunction)

Des idées? d'autres solutions?

Merci.

+0

Pourriez-vous vous fournir la signature P/Invoke et la valeur de WH_KEYBOARD_LL? – SwDevMan81

+0

[DllImport ("user32.dll", SetLastError = true)] private static externe IntPtr SetWindowsHookEx (code HookType, fonction HookProc, instance IntPtr, int threadID); WH_KEYBOARD_LL = 13 – Eden

Répondre

1

Essayez d'utiliser ceci pour obtenir le HINSTANCE:

Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]); 
+0

C'est le code exact que j'utilise et il renvoie une valeur valide. – Eden

0

Si vous avez seulement besoin est de gérer la combinaison de touches spécifique, il est préférable d'utiliser les raccourcis clavier. Cela montre comment configurer les raccourcis clavier: Hotkeys

+0

Et cela montre comment accrocher WndProc dans WPF: http://blogs.msdn.com/nickkramer/archive/2006/03/18/554235.aspx – Giorgi

+0

À moins que je ne manque quelque chose, accrocher dans WndProc peut seulement intercepter le message tout en ma fenêtre est active. mon but est de gagner du focus lorsque l'utilisateur travaille dans une autre fenêtre? est-ce que je me suis trompé? – Eden

+0

En winforms WndProc intercepte les massages tout le temps. Je suis sûr que cela fonctionne de la même manière dans WPF. – Giorgi

0

Here est un bon artical sur le crochet de clavier bas niveau en C#. Cela pourrait avoir quelques choses qui vous manquent.

0

J'ai utilisé this code hokey pour mon application non seulement pour mettre l'accent sur l'application avec un raccourci clavier, mais aussi pour lancer l'application avec un raccourci clavier. Donc, tout comme vous appuyez sur Win + E pour lancer Windows Explorer, vous pouvez appuyer sur Win + S pour lancer votre application. Très utile.

http://code.google.com/p/blinkln/source/browse/trunk/HotKey.cs?r=12