2009-11-21 199 views
3

這是我的keyhooking類的代碼,但它不起作用。我想知道是否有人能告訴我爲什麼?我在另一個控制檯應用程序中進行實例化。調試消息提供了正確的輸出,但鍵盤鉤子根本無法捕獲鍵。我希望有人能告訴我爲什麼。C#低級鍵盤掛鉤不工作

namespace GlobalHooks 
{ 
    public class InterceptKeys 
    {   
     private const int WH_KEYBOARD_LL = 13; 
     private const int WM_KEYDOWN = 0x0100; 

     private static IntPtr _hookID = IntPtr.Zero; 
     private static String keysHooked = String.Empty; 

     private static LowLevelHookProc keyboardHook; 

     public delegate IntPtr LowLevelHookProc(int nCode, Int32 wParam, IntPtr lParam); 
     public delegate void KeyboardHandleFunction(int vkCode); 
     public static event KeyboardHandleFunction keyHookReturn; 

     public InterceptKeys(KeyboardHandleFunction func) 
     { 
      keyHookReturn = func; 
      keyboardHook = new LowLevelHookProc(HookCallback); 
     } 

     public static void debug() 
     { 
      Console.Write("\n[Success!] _hookID: "+_hookID); 
      Console.Write("\n[Success!] keyboardProc: "+keyboardHook.ToString()); 
     } 

     private IntPtr SetupHook(LowLevelHookProc keyProcess) 
     { 
      using (Process curProcess = Process.GetCurrentProcess()) 
      using (ProcessModule curModule = curProcess.MainModule) 
      { 
       return SetWindowsHookEx(WH_KEYBOARD_LL, keyProcess, 
        GetModuleHandle(curModule.ModuleName), 0); 
      } 
     } 

     public void Hook() 
     { 
      _hookID = SetupHook(keyboardHook); 
      debug(); 
     } 

     public void Unhook() 
     { 
      UnhookWindowsHookEx(_hookID); 
     } 


     public static void OnCallbackReturn(int nCode) 
     { 
      if (keyHookReturn != null) 
      { 
       keyHookReturn(nCode); 
      } 
      else 
      { 
       throw new Exception(); 
      } 
     } 

     public static IntPtr HookCallback(int nCode, Int32 wParam, IntPtr lParam) 
     { 
      Console.WriteLine("Calledback"Wink; 
      if (nCode >= 0 && wParam == WM_KEYDOWN) 
      { 
       int vkCode = Marshal.ReadInt32(lParam); 
       Console.WriteLine((Keys)vkCode); 
       OnCallbackReturn(nCode); 
      } 
      return CallNextHookEx((int)_hookID, nCode, wParam, lParam); 
     } 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelHookProc lpfn, IntPtr hMod, uint dwThreadId); 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern bool UnhookWindowsHookEx(IntPtr hhk); 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr CallNextHookEx(int hhk, int nCode, int wParam, IntPtr lParam); 

     [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr GetModuleHandle(string lpModuleName); 
    } 
} 

回答

13

你叫你的Main功能Application.Run

標準控制檯線程沒有消息循環,這是鉤子正常工作所必需的,Application.Run負責處理該消息。

+0

你是一個美麗,美麗的人。祝你夢想成真。 謝謝你,你的解決方案工作完美。 – Overload119 2009-11-22 15:31:53

+0

Application.Run將我的控制檯應用放在了繁忙的地方。有沒有辦法讓我繼續運行控制檯應用程序? – 2013-06-11 12:12:25