2009-07-28 9 views
0

Der folgende Code wird alle Tastenkombinationen blockieren. Da ich das in meiner Hauptanwendung implementieren wollte. Ich habe eine DLL aus dem folgenden Code erstellt. Nachdem ich die .dll als Referenz zu meiner Hauptanwendung hinzugefügt habe, habe ich die Anwendung gestartet. Es funktioniert am Anfang gut. Dann, wenn ich einige andere Sachen mache und dann den Shorcut überprüfe, ist es nicht deaktiviert, was meine .dll immer tun muss, bis die .exe für meine Hauptanwendung beendet wird.Problem Referenzieren von .dll zu C# Windows-Anwendung

Warum deaktiviert meine .dll die Verknüpfungen nicht nach einiger Zeit?

Quellcode für den Aufruf von DLL von Program.cs:


using DisableHotKeys; 


public static class Program 
{ 
    public static DisableKeys disableKeysInstance = new DisableKeys(); 

    [STAThread] 
    static void Main() 
    { 
     disableKeysInstance.DisableKeyboardHook(); 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(Screensaver.ScreensaverRef); 
    } 

}

Quellcode der DLL:


namespace DisableHotKeys 
{ 

    public class DisableKeys 
    { 
     private delegate int LowLevelKeyboardProcDelegate(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam); 
     [DllImport("user32.dll", EntryPoint = "SetWindowsHookExA", CharSet = CharSet.Ansi)] 
     private static extern int SetWindowsHookEx(int idHook,  LowLevelKeyboardProcDelegate lpfn, int hMod, int dwThreadId); 
     [DllImport("user32.dll")] 
     private static extern int UnhookWindowsHookEx(int hHook); 
     [DllImport("user32.dll", EntryPoint = "CallNextHookEx", CharSet = CharSet.Ansi)] 
     private static extern int CallNextHookEx(int hHook, int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam); 
     const int WH_KEYBOARD_LL = 13; 
     private int intLLKey; 

     private struct KBDLLHOOKSTRUCT 
     { 
      public int vkCode; 
      int scanCode; 
      public int flags; 
      int time; 
      int dwExtraInfo; 
     } 
     private int LowLevelKeyboardProc(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam) 
     { 
      bool blnEat = false; switch (wParam) 
      { 
       case 256: 
       case 257: 
       case 260: 
       case 261: 
        //Alt+Tab, Alt+Esc, Ctrl+Esc, Windows Key       
        if (((lParam.vkCode == 9) && (lParam.flags == 32)) || 
         ((lParam.vkCode == 27) && (lParam.flags == 32)) || 
         ((lParam.vkCode == 27) && (lParam.flags == 0)) || 
         ((lParam.vkCode == 91) && (lParam.flags == 1)) || 
         ((lParam.vkCode == 92) && (lParam.flags == 1)) || 
         ((true) && (lParam.flags == 32))) 
        { 
         blnEat = true; 
        } 
        break; 
      } if (blnEat) return 1; else return CallNextHookEx(0, nCode, wParam, ref lParam); 
     } 
     public void DisableKeyboardHook() 
     { 
      intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL, new LowLevelKeyboardProcDelegate(LowLevelKeyboardProc), System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]).ToInt32(), 0); 
     } 
     private void ReleaseKeyboardHook() 
     { 
      intLLKey = UnhookWindowsHookEx(intLLKey); 
     } 
    } 
} 

Antwort

0

Welche anderen Code tut Deine Bewerbung?

Bei der Verwendung von WH_KEYBOARD_LL Ihre Haken durch das System benötigt wird, um die Nachricht zu verarbeiten, es innerhalb eines bestimmten Zeitrahmens (in der Registrierung angegeben: KEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout) wird - wenn es scheitert, dies zu tun, wird das System einfach den nächsten Haken ruft in Die Kette. Stellen Sie also absolut sicher, dass jeder andere Code, den Sie haben, Nachrichten mit der höchsten Priorität pumpt.

Versuchen Sie, den Registrierungswert hochzusetzen und zu testen, ob das hilft - wenn Sie wissen, dass Ihr Code schneller auf den Hook-Switch reagieren muss.