Overload119 Ответов: 2

Крючок клавиатуры C# не работает


Это не работает.

Никакого сообщения об ошибке или чего-то еще, это просто не работает.

 Кто-нибудь знает почему?

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

2 Ответов

Рейтинг:
1

Judah Gabriel Himango

Ваш HookCallback является сборщиком мусора, как только крюк() осуществляется исполнителем. Сборщик мусора не знает о машинном коде, например SetWindowsHookEx пытается ссылаться на вашу функцию C#.

Чтобы исправить это, сохраните поле в своем классе типа HookProc. В методе Hook() установите для поля значение HookCallback. Затем передайте это поле в качестве аргумента SetWindowsHookEx.  Это будет держать ваш крючок живым до тех пор, пока экземпляр класса InterceptKeys жив. 


Рейтинг:
0

Overload119

       частный статический HookProc KeyboardProc;


        публичные ключи перехвата(держатель строки)
        {
            Крюк();
        }

        общественного недействительными крюк()
        {
            Указателя IntPtr hInstance = ошибка при вызове LoadLibrary("библиотека user32");
            
            KeyboardProc = HookCallback;
            _hookID = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, hInstance, 0);

            if (_hookID = = (IntPtr) 0)
            {
                Приставка.WriteLine ("не удалось зацепить.");
            }
            Приставка.WriteLine ("[Успех!] _hookID: "+_hookID);
        }

 

Это новый код, надеюсь, я сделал то, что вы просили. Но все равно это не работает. Крючок работает и все такое, но ключи все равно не ловятся. Я тоже пытался

 KeyboardProc = новый HookProc(HookCallback);

Это тоже не сработало.