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