2010-12-10 13 views
1

J'ai besoin d'écrire une application qui intercepte globalement Alt + Maj + S.Comment implémenter Global Hotkeys en C#?

Ce que je fait est que je créé une DLL qui fixe les crochets mondiaux:

namespace Hotkeydll 
{ 
    public class MyHotKey 
    { 
     public static void setHooks() 
     { 
      KeyboardHookProcedure = new HookProc(KeyboardHookProc); 
      hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0); 
     } 

     private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) 
     { 
      //write something into file 
     } 


    } 
} 

Ensuite, je créé un programme qui charge cette DLL et mettre le crochet:

using Hotkeydll; 
namespace IWFHotkeyStarter 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      MyHotKey.setHooks(); 
     } 
    } 
} 

Maintenant, le problème est que la touche de raccourci ne fonctionne pas.

Il semble que la DLL ne soit pas chargée en permanence dans la mémoire. Je vois que je peux supprimer le fichier dll du système de fichiers.

Alors s'il vous plaît aviser ce que je fais mal?

Dois-je utiliser une approche différente?

Merci.

+0

Qu'est-ce que votre look de code PInvoke comme pour 'SetWindowsHookEx' – SwDevMan81

+1

Cela pourrait être utile http://www.codeproject.com/KB/cs/globalhook.aspx – fardjad

Répondre

1

Votre méthode Main() définit les points d'ancrage, puis quitte immédiatement et termine le programme. De plus, vous avez besoin d'une boucle de message pour que le callback hook fonctionne. Cela nécessite une application Windows Forms ou WPF. L'utilisation d'une véritable touche de raccourci à la place d'un crochet devient également une option. Vérifiez this thread pour un exemple, C# est plus bas sur la page.

0

Les crochets de clavier ne sont généralement pas la bonne façon d'obtenir des raccourcis clavier globaux.

Utilisez RegisterHotkey autant que possible.

+0

lol, C++ et thats pas C# – Paedow

+0

@Paedow C'est l'API Windows. Vous devrez utiliser une méthode p/invoke, mais ce n'est pas difficile. – CodesInChaos

+0

C'est juste la chose que je ne suis pas très bon parce que je n'ai jamais appris – Paedow