2012-02-22 91 views
0

我做了一個簡單的鍵盤鉤子在C#,所以我有這個下面的代碼:鉤鍵盤:如何獲取鍵被按下的程序名稱?

 private static IntPtr hKeyboardHook = IntPtr.Zero; 
     private const int WH_KEYBOARD_LL = 13; 
     private const int WM_KEYDOWN = 0x100; 

     private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr 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, CallingConvention = CallingConvention.StdCall, SetLastError = true)] 
     private static extern int UnhookWindowsHookEx(IntPtr idHook); 
     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); 
     [DllImport("user32")] 
     private static extern int ToAscii(int uVirtKey, int uScanCode, byte[] lpbKeyState, byte[] lpwTransKey, int fuState); 
     [DllImport("user32")] 
     private static extern int GetKeyboardState(byte[] pbKeyState); 
     [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
     private static extern short GetKeyState(int vKey); 
     private delegate int HookProc(int nCode, int wParam, IntPtr lParam); 
     [DllImport("kernel32.dll")] 
     public static extern IntPtr GetModuleHandle(string lpModuleName); 
     private static LowLevelKeyboardProc _proc = HookCallback; 

public void initialization() 
     { 
      using (Process curProcess = Process.GetCurrentProcess()) 
       using (ProcessModule curModule = curProcess.MainModule) 
       { 
        hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, GetModuleHandle(curModule.ModuleName), 0); 
       } 
     } 

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
    { 
     if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) 
     { 
      int vkCode = Marshal.ReadInt32(lParam); 
      if (vkCode >= 32 && vkCode < 160) 
       Console.Write((Keys)vkCode); 
      if (vkCode == 13) 
       Console.WriteLine("\n"); 
     } 
     return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); 
    } 

它工作正常,沒有問題!我的程序會抓住其他程序中的所有按鍵並將其寫入控制檯。 但我想要的程序的名稱按鍵,我不知道我怎麼能做到這一點。

任何人都可以幫到我嗎?

回答

2

您正在使用低級掛鉤(WH_KEYBOARD_LL)。在窗口管理器決定哪個程序將接收消息之前調度低級掛鉤。因此,窗口管理器還沒有確定按鍵將被傳送到哪個程序,所以沒有「按鍵被按下的程序的名稱」。 (你可以嘗試通過調用GetForegroundWindow來猜測。)

(只是好奇:你用鍵盤鉤子試圖解決的最終問題是什麼?也許還有更好的辦法,我希望你不寫一個鍵盤記錄)。

+0

我正在學習C#,我認爲這是一個很好的練習。 Buf如果我不能用低級鉤子做到這一點並不重要 – 2012-02-22 16:11:55

+0

我可以建議如果你只是在學習,你會選擇一些更簡單的東西。鍵盤記錄其實很難。 – 2012-02-22 17:43:25