加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#低级键盘挂钩不工作

发布时间:2020-12-16 00:12:26 所属栏目:百科 来源:网络整理
导读:这是我的keyhooking类的代码,但它不起作用.我想知道是否有人可以告诉我为什么?我正在另一个控制台应用程序中实现它.调试消息提供正确的输出,但键盘钩子根本不捕获键.我希望有人能告诉我原因. namespace GlobalHooks{ public class InterceptKeys { private
这是我的keyhooking类的代码,但它不起作用.我想知道是否有人可以告诉我为什么?我正在另一个控制台应用程序中实现它.调试消息提供正确的输出,但键盘钩子根本不捕获键.我希望有人能告诉我原因.

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,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",SetLastError = true)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);

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

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

解决方法

你在Main函数中调用Application.Run吗?

标准的Console线程没有消息循环,这是钩子正常工作所必需的,Application.Run负责这一点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读