【问题标题】:hook keyboard : how to get the name of program where the key is pressed?钩子键盘:如何获取按键所在程序的名称?
【发布时间】:2012-03-12 18:25:35
【问题描述】:

我用 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);
    }

它工作正常,没有问题!我的程序抓住了其他程序中按下的所有键并将其写在控制台上。 但是我想知道按键所在的程序的名称,我不知道该怎么做。

谁能帮帮我?

【问题讨论】:

    标签: c# windows c#-4.0 keyboard hook


    【解决方案1】:

    您正在使用低级挂钩 (WH_KEYBOARD_LL)。在窗口管理器决定哪个程序将接收消息之前调度低级挂钩。因此,没有“按键被按下的程序的名称”,因为窗口管理器还没有决定按键将被传递到哪个程序。 (您可以拨打GetForegroundWindow尝试猜测。)

    (只是好奇:您尝试使用键盘挂钩解决的最终问题是什么?也许有更好的方法。我希望您不是在编写键盘记录器。)

    【讨论】:

    • 我正在学习 C#,我认为这是一个很好的练习。如果我不能用低级钩子做到这一点,那就不重要了
    • 我建议,如果你只是在学习,你可以选择简单一些的东西。键盘记录实际上非常困难。
    猜你喜欢
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多