2010-12-10 4 views
1

Ich muss eine Anwendung schreiben, die Alt + Shift + S global abfängt.Wie werden globale Hotkeys in C# implementiert?

Was habe ich, das ich eine DLL erstellt, den globalen Haken setzt:

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 
     } 


    } 
} 

Dann habe ich ein Programm, das dieses DLL lädt und setzen Sie den Haken:

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

Das Problem ist jetzt, dass Der Hotkey funktioniert nicht.

Es sieht so aus, als ob die DLL nicht dauerhaft in den Speicher geladen wird. Ich sehe, dass ich die DLL-Datei aus dem Dateisystem löschen kann.

Also bitte beraten, was ich falsch mache?

Sollte ich einen anderen Ansatz verwenden?

Vielen Dank.

+0

Was macht Ihr PInvoke Code aussehen wie für 'SetWindowsHookEx' – SwDevMan81

+1

Dies kann hilfreich sein http://www.codeproject.com/KB/cs/globalhook.aspx – fardjad

Antwort

1

Ihre Main() -Methode setzt die Hooks, dann wird das Programm sofort beendet und beendet. Außerdem benötigen Sie eine Nachrichtenschleife, damit der Hook-Callback funktioniert. Das erfordert eine Windows Forms- oder WPF-App. Die Verwendung eines echten Hotkeys anstelle eines Hooks wird nun ebenfalls zur Option. Überprüfen Sie this thread für ein Beispiel, C# ist weiter unten auf der Seite.

0

Tastatur-Hooks sind normalerweise nicht der richtige Weg, globale Hotkeys zu erhalten.

Verwenden Sie RegisterHotkey wann immer möglich.

+0

lol, das ist C++ und nicht c – Paedow

+0

# @Paedow Das ist die Windows-API. Sie müssen eine passende p/invoke-Methode verwenden, aber das ist nicht schwer. – CodesInChaos

+0

Es ist einfach die Sache, dass ich nicht so gut darin bin, weil ich es nie gelernt habe – Paedow