C#键盘钩不工作 [英] C# Keyboard Hook not Working

查看:90
本文介绍了C#键盘钩不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这不起作用。

没有错误消息或任何内容,它只是不起作用。

No error message or anything, it just doesn't work.

 任何人都知道为什么?

 Anyone know why?

    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;

        public InterceptKeys(String holder)
        {
        //    keysHooked = holder;
            Hook();
        }

        public void Hook()
        {
            IntPtr hInstance = LoadLibrary("User32");
            Console.WriteLine("hInstance: "+hInstance);
            _hookID = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, hInstance, 0);
            Console.WriteLine("_hookID: "+_hookID);
        }

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

        public delegate int HookProc(int code, int wParam, HookStruct lParam);

        public struct HookStruct {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }
        
        public int HookCallback(int code, int wParam, HookStruct lParam) 
        {   
                if (code >= 0 && wParam == WM_KEYDOWN)
                {
                    int vkCode = lParam.vkCode;
                    Console.WriteLine((Keys)vkCode);
                }
            return CallNextHookEx(_hookID, code, wParam, lParam);
        }
        
        [DllImport("user32.dll")]
        static extern IntPtr SetWindowsHookEx(int idHook, HookProc callback, IntPtr hInstance, uint threadId);
        
        [DllImport("user32.dll")]
        static extern bool UnhookWindowsHookEx(IntPtr hInstance);

        [DllImport("user32.dll")]
        static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, HookStruct lParam);

        [DllImport("kernel32.dll")]
        static extern IntPtr LoadLibrary(string lpFileName);
    }

推荐答案

一旦Hook()完成执行,你的HookCallback就会被垃圾收集。垃圾收集器不知道像SetWindowsHookEx尝试引用您的C#函数的本机代码。

Your HookCallback is being garbage collected as soon as Hook() is done executing. The garbage collector doesn't know about native code like SetWindowsHookEx is trying to reference your C# function.

要解决此问题,请在HookProc类型的类中存储一个字段。在Hook()方法中,将字段设置为HookCallback。然后将该字段作为参数传递给SetWindowsHookEx。  只要InterceptKeys类实例处于活动状态,这将使您的钩子保持活动状态。 

To fix this, store a field in your class of type HookProc. In the Hook() method, set the field to HookCallback. Then pass in the field as the argument to SetWindowsHookEx.  This will keep your hook alive as long as InterceptKeys class instance is alive. 


       private static HookProc KeyboardProc;


       public InterceptKeys(String holder)
        {结果           钩();结果        }搜索结果        public void Hook()
        {结果            IntPtr hInstance = LoadLibrary(User32);
            结果            KeyboardProc = HookCallback;
            _hookID = SetWindowsHookEx(WH_KEYBOARD_LL,KeyboardProc,hInstance,0);

            if(_hookID ==(IntPtr)0)
            {结果                Console.WriteLine(无法挂钩。);
            }结果,            Console.WriteLine([Success!] _hookID:+ _hookID);
        }

       private static HookProc KeyboardProc;


        public InterceptKeys(String holder)
        {
            Hook();
        }

        public void Hook()
        {
            IntPtr hInstance = LoadLibrary("User32");
            
            KeyboardProc = HookCallback;
            _hookID = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, hInstance, 0);

            if (_hookID == (IntPtr) 0)
            {
                Console.WriteLine("Failed to hook.");
            }
            Console.WriteLine("[Success!] _hookID: "+_hookID);
        }

 

这是新代码,希望我按你的要求做了。但仍然没有工作。 hookID正在工作和一切,但仍然没有被抓住的键。我也尝试了

This is the new code, hopefully I did what you asked. Still isn't working though. The hookID is working and everything, but still no keys being caught. I also tried

  KeyboardProc = new HookProc(HookCallback);

 KeyboardProc = new HookProc(HookCallback);

这也不起作用。


这篇关于C#键盘钩不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆