public GlobalHook()
    {
        // Создадим колбэки и сохраним их в полях класса, чтобы их не собрал GC
        _keyboardCallback = new WinAPI.User32.KeyboardHookProc((int code,
                                                                WinAPI.User32.WindowsMessage wParam, ref WinAPI.User32.KeyboardHookStruct lParam) =>
        {
            // Если code < 0, мы не должны обрабатывать это сообщение системы
            if (code >= 0)
            {
                var key       = (Keys)lParam.VKCode;
                var eventArgs = new KeyEventArgs(key);

                // В зависимости от типа пришедшего сообщения вызовем то или иное событие
                switch (wParam)
                {
                case WinAPI.User32.WindowsMessage.KeyDown:
                case WinAPI.User32.WindowsMessage.SysKeyDown:
                    KeyDown(this, eventArgs);
                    break;

                case WinAPI.User32.WindowsMessage.KeyUp:
                case WinAPI.User32.WindowsMessage.SysKeyUp:
                    KeyUp(this, eventArgs);
                    break;
                }

                // Если событие помечено приложением как обработанное,
                // прервём дальнейшее распространение сообщения
                if (eventArgs.Handled)
                {
                    return(1);
                }
            }

            // Вызовем следующий обработчик
            return(WinAPI.User32.CallNextHookEx(_keyboardHookHandle, code, wParam, ref lParam));
        });

        _mouseCallback = new WinAPI.User32.MouseHookProc((int code,
                                                          WinAPI.User32.WindowsMessage wParam, ref WinAPI.User32.MouseHookStruct lParam) =>
        {
            // Если code < 0, мы не должны обрабатывать это сообщение системы
            if (code >= 0)
            {
                // В зависимости от типа пришедшего сообщения вызовем то или иное событие
                switch (wParam)
                {
                case WinAPI.User32.WindowsMessage.MouseMove:
                    MouseMove(this,
                              new MouseEventArgs(MouseButtons.None, 0, lParam.X, lParam.Y, 0));
                    break;

                case WinAPI.User32.WindowsMessage.LeftButtonDown:
                    MouseButtonDown(this,
                                    new MouseEventArgs(MouseButtons.Left, 0, lParam.X, lParam.Y, 0));
                    break;

                case WinAPI.User32.WindowsMessage.RightButtonDown:
                    MouseButtonDown(this,
                                    new MouseEventArgs(MouseButtons.Right, 0, lParam.X, lParam.Y, 0));
                    break;

                case WinAPI.User32.WindowsMessage.MiddleButtonDown:
                    MouseButtonDown(this,
                                    new MouseEventArgs(MouseButtons.Middle, 0, lParam.X, lParam.Y, 0));
                    break;

                case WinAPI.User32.WindowsMessage.LeftButtonUp:
                    MouseButtonUp(this,
                                  new MouseEventArgs(MouseButtons.Left, 0, lParam.X, lParam.Y, 0));
                    break;

                case WinAPI.User32.WindowsMessage.RightButtonUp:
                    MouseButtonUp(this,
                                  new MouseEventArgs(MouseButtons.Right, 0, lParam.X, lParam.Y, 0));
                    break;

                case WinAPI.User32.WindowsMessage.MiddleButtonUp:
                    MouseButtonUp(this,
                                  new MouseEventArgs(MouseButtons.Middle, 0, lParam.X, lParam.Y, 0));
                    break;
                }
            }

            // Вызовем следующий обработчик
            return(WinAPI.User32.CallNextHookEx(_mouseHookHandle, code, wParam, ref lParam));
        });

        // В SetWindowsHookEx следует передать дескриптор библиотеки user32.dll
        // Библиотека user32 всё равно всегда загружена в приложениях .NET,
        // хранить и освобождать дескриптор или что-либо ещё с ним делать нет необходимости
        IntPtr user32Handle = WinAPI.Kernel32.LoadLibrary("user32");

        // Установим хуки
        _keyboardHookHandle = WinAPI.User32.SetWindowsHookEx(
            WinAPI.User32.WindowsHook.KeyboardLowLevel, _keyboardCallback, user32Handle, 0);

        _mouseHookHandle = WinAPI.User32.SetWindowsHookEx(
            WinAPI.User32.WindowsHook.MouseLowLevel, _mouseCallback, user32Handle, 0);
    }
示例#2
0
        public GlobalHook()
        {
            _keyboardCallback = new WinAPI.User32.KeyboardHookProc((int code,
                                                                    WinAPI.User32.WindowsMessage wParam, ref WinAPI.User32.KeyboardHookStruct lParam) =>
            {
                if (code >= 0)
                {
                    var key       = (Keys)lParam.VKCode;
                    var eventArgs = new KeyEventArgs(key);


                    switch (wParam)
                    {
                    case WinAPI.User32.WindowsMessage.KeyDown:
                    case WinAPI.User32.WindowsMessage.SysKeyDown:
                        KeyDown(this, eventArgs);
                        break;

                    case WinAPI.User32.WindowsMessage.KeyUp:
                    case WinAPI.User32.WindowsMessage.SysKeyUp:
                        KeyUp(this, eventArgs);
                        break;
                    }


                    if (eventArgs.Handled)
                    {
                        return(1);
                    }
                }


                return(WinAPI.User32.CallNextHookEx(_keyboardHookHandle, code, wParam, ref lParam));
            });

            _mouseCallback = new WinAPI.User32.MouseHookProc((int code,
                                                              WinAPI.User32.WindowsMessage wParam, ref WinAPI.User32.MouseHookStruct lParam) =>
            {
                if (code >= 0)
                {
                    switch (wParam)
                    {
                    case WinAPI.User32.WindowsMessage.MouseMove:
                        MouseMove(this,
                                  new MouseEventArgs(MouseButtons.None, 0, lParam.X, lParam.Y, 0));
                        break;

                    case WinAPI.User32.WindowsMessage.LeftButtonDown:
                        MouseButtonDown(this,
                                        new MouseEventArgs(MouseButtons.Left, 0, lParam.X, lParam.Y, 0));
                        break;

                    case WinAPI.User32.WindowsMessage.RightButtonDown:
                        MouseButtonDown(this,
                                        new MouseEventArgs(MouseButtons.Right, 0, lParam.X, lParam.Y, 0));
                        break;

                    case WinAPI.User32.WindowsMessage.MiddleButtonDown:
                        MouseButtonDown(this,
                                        new MouseEventArgs(MouseButtons.Middle, 0, lParam.X, lParam.Y, 0));
                        break;

                    case WinAPI.User32.WindowsMessage.LeftButtonUp:
                        MouseButtonUp(this,
                                      new MouseEventArgs(MouseButtons.Left, 0, lParam.X, lParam.Y, 0));
                        break;

                    case WinAPI.User32.WindowsMessage.RightButtonUp:
                        MouseButtonUp(this,
                                      new MouseEventArgs(MouseButtons.Right, 0, lParam.X, lParam.Y, 0));
                        break;

                    case WinAPI.User32.WindowsMessage.MiddleButtonUp:
                        MouseButtonUp(this,
                                      new MouseEventArgs(MouseButtons.Middle, 0, lParam.X, lParam.Y, 0));
                        break;
                    }
                }


                return(WinAPI.User32.CallNextHookEx(_mouseHookHandle, code, wParam, ref lParam));
            });

            IntPtr user32Handle = WinAPI.Kernel32.LoadLibrary("user32");


            _keyboardHookHandle = WinAPI.User32.SetWindowsHookEx(
                WinAPI.User32.WindowsHook.KeyboardLowLevel, _keyboardCallback, user32Handle, 0);

            _mouseHookHandle = WinAPI.User32.SetWindowsHookEx(
                WinAPI.User32.WindowsHook.MouseLowLevel, _mouseCallback, user32Handle, 0);
        }