1

デスクトップ アプリケーションでキーボードの低レベル フックを使用して、ユーザー アクティビティを監視しています。フックに使用しているコードを以下に示します。このコード (私の知る限り) では、ユーザー アクティビティの監視を開始する必要があるときに、SetHook()これを呼び出してフックをインストールし、キーボードで押されたキーを監視できます。キーのキャプチャを停止したい場合は、UnHook() メソッドを呼び出すだけです。

問題は、アプリケーションの開始時 (SetHook()メソッドがまだ呼び出されていない場合) に、アプリケーションのインストールが自動的にフックされ、システムの速度が低下することです。システムは、1 ミントごとに 2 ~ 3 秒間ハングします。

問題を診断するために、以下のすべてのコードとインストールされたアプリケーションをコメントアウトしました。これで、システムは完全に正常に動作します。

なぜこれが起こっているのかわからないのですか?

  1. SetHook()メソッドをまだ呼び出していないのに、アプリケーションがキーのキャプチャを開始するのはなぜですか?
  2. フックを使用せずにグローバル キーをキャプチャする他の方法はありますか?

フックのコード:

public static class WinKeyCapture5   {

   private const int WH_KEYBOARD_LL = 13;
   private const int WM_KEYDOWN = 0x0100;
   private static LowLevelKeyboardProc _proc = HookCallback;
   public static DateTime LastKeyPressTime;

   public static void SetHook()
   {
       SetHook(_proc);
   }

   public static void UnHook()
   {
       UnhookWindowsHookEx(_hookID);
   }

   private static IntPtr SetHook(LowLevelKeyboardProc proc)
   {
       using (Process curProcess = Process.GetCurrentProcess())
       using (ProcessModule curModule = curProcess.MainModule)
       {
           return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
       }
   }

   private static IntPtr _hookID = IntPtr.Zero;

   private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

   private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
   {
       //if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
       //{
           int vkCode = Marshal.ReadInt32(lParam);
           //if (vkCode == 44)
               //ScreenCapture.Load();



           LastKeyPressTime = System.DateTime.Now;


       //}

       return CallNextHookEx(_hookID, nCode, wParam, lParam);
   }
   [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
   private static extern IntPtr SetWindowsHookEx(int idHook,
       LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
   [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
   [return: MarshalAs(UnmanagedType.Bool)]
   private static extern bool UnhookWindowsHookEx(IntPtr hhk);
   [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
   private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
       IntPtr wParam, IntPtr lParam);
   [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
   private static extern IntPtr GetModuleHandle(string lpModuleName); 
}
4

0 に答える 0