2009-07-28 21 views
0

下面的代碼將阻止所有鍵盤快捷鍵。因爲我想在我的主應用程序中實現它。我從下面的代碼中創建了一個.dll文件。 在我將.dll引用到我的主應用程序後,我啓動了應用程序。 它在開始工作正常。然後,如果我做了一些其他的東西,然後檢查shorcut,它不會被禁用,我的.dll必須始終做,直到我的主要應用程序的.exe終止。問題將.dll引用到c#windows應用程序

爲什麼我的.dll在一段時間後沒有禁用快捷方式?從Program.cs中調用.DLL

源代碼:


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); 
    } 

} .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); 
     } 
    } 
} 

回答

0

代碼做其他什麼你的應用程序呢?

當使用WH_KEYBOARD_LL你的鉤子是由系統來處理它會在一定的時間框架(在註冊表中指定:KEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout)內的消息必需的 - 如果不這樣做,系統會簡單地調用下一個鉤子連鎖,鏈條。因此,要確保無論您的其他代碼是以最高優先級抽出消息。

嘗試設置註冊表值並測試是否有幫助 - 如果確實有幫助 - 您知道您的代碼需要更快地響應掛鉤開關。

相關問題