2009-07-28 9 views
0

以下のコードはすべてのキーボードショートカットをブロックします。私は私の主なアプリケーションでこれを実装したかったので。私は以下のコードから.dllを作成しました。 私のメインアプリケーションへの参照として.dllを含めた後、私はアプリケーションを起動しました。 最初からうまくいきます。その後、私はいくつかの他のものをし、shorcutをチェックすると、私のメインアプリケーションのための.exeが終了するまで、私の.dllがいつもしなければならない、それは無効ではありません。問題.dllをc#Windowsアプリケーションに参照する

なぜ私の.dllはしばらくしてショートカットを無効にしていないのですか?

のProgram.csからの.dll呼び出すためのソースコード:.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); 
    } 

}

ソースコード:


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)一定の時間枠内で取得するメッセージを処理するシステムが必要とされるを使用して - それはそうしなかった場合、システムは単純で、次のフックを呼び出します。チェーン。したがって、あなたが持っている他のどのコードでも、メッセージを最優先でポンピングすることが絶対に確実です。

レジストリ値を設定してテストしてください。役立つかどうかテストしてください。コードがフックスイッチにすばやく反応する必要があることがわかっている場合は、テストしてください。

関連する問題