Beispiel #1
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);
        }
Beispiel #2
0
        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);
        }