2012-02-22 57 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

相关问题