2009-07-28 2 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) 정해진 시간 안에 도착 메시지를 처리 ​​할 수있는 시스템이 필요합니다을 사용하여 - 그것은 그렇게하지 않을 경우, 시스템은 단순히의 다음 훅을 호출한다 사슬. 그래서 당신이 가지고있는 다른 코드가 무엇이든 최우선 순위로 메시지를 펌핑한다는 것이 절대적으로 확실합니다.

레지스트리 값을 설정하고 테스트하면 도움이되는지 테스트하십시오. 코드가 후크 스위치에 더 빨리 응답해야한다는 것을 알고 있다면 테스트하십시오.

관련 문제