
KeyboardHook: кроссплатформенный глобальный перехват клавиатуры и мыши для .NET
c3n9 1 час назад KeyboardHook: кроссплатформенный глобальный перехват клавиатуры и мыши для .NET 8 мин 2.7K .NET * Open source * C# * Программирование * Обзор Проблема: ни один готовый пакет не подошёлПервые несколько...
Значимый прорыв формирует отрасль ИИ: c3n9 1 час назад KeyboardHook: кроссплатформенный глобальный перехват клавиатуры и мыши для . NET * Open source * C# * Программирование * Обзор Проблема: ни один готовый пакет не подошёлПервые несколько пакетов, которые я попробовал, работали исключительно на Windows и молчали на macOS. Другие просто вешали приложение при первом нажатии клавиши.
Я искал кроссплатформенное решение, «только Windows» меня не устраивало. Если чего-то нет, что делать? Конечно, писать самому.
Технические детали
По началу всё было написано даже без вынесения в отдельную библиотеку, но чуть позже, когда данный код понадобился и в других моих проектах, подумал написать библиотеку с нуля. Самое главное чего я хотел добиться: без лишних зависимостей, кроссплатформенность, возможность кочевать между pet-проектами. По ходу решил сделать ее open source, чтобы неминуемо улучшать и совершенствовать данное решение.
KeyboardHook - кроссплатформенный глобальный хук клавиатуры и мыши для . Что умеет библиотекаГлобальный перехват нажатий и отпусканий клавиш — работает даже когда ваше приложение не в фокусеГлобальный перехват событий мыши (Left, Right, Middle)Программная эмуляция нажатий клавиш и кнопок мышиПоддержка комбинаций клавиш (Ctrl+C, Alt+F4 и любых других)Три платформы: Windows x86/x64, macOS Arm64, Linux x64 (X11)Нет внешних зависимостей — только стандартный . NET и P/Invoke к системным библиотекамУстановка одной строкой:dotnet add package KeyboardHook Архитектура: один интерфейс, три реализацииКлючевое решение — полное разделение публичного API и платформенного кода.
Снаружи пользователь видит только два интерфейса:public interface public interface Получить нужную реализацию — одна строка, платформа определяется в рантайме:IKeyboardHook keyboard = KeyboardHookFactory. Create(); IMouseHook mouse = MouseHookFactory. Create(); Фабрика внутри выглядит так:public static class KeyboardHookFactory { public static IKeyboardHook Create() { if (RuntimeInformation.
Отраслевые последствия
IsOSPlatform(OSPlatform. Windows)) return new WindowsKeyboardHook(); if (RuntimeInformation. IsOSPlatform(OSPlatform.
Linux)) return new LinuxKeyboardHook(); if (RuntimeInformation. IsOSPlatform(OSPlatform. OSX)) return new MacKeyboardHook(); throw new PlatformNotSupportedException("Unsupported platform } } Маппинг клавиш: атрибуты вместо switch-портянокКаждая платформа использует свои коды клавиш.
На Windows это Virtual Key Codes, на Linux — X11 keycodes, на macOS — Virtual Key коды CoreGraphics. Вместо трёх гигантских switch-выражений я решил хранить коды прямо в enum через кастомные атрибуты:public enum Атрибуты минималистичны: public class Конвертация в обе стороны через рефлексию:internal static int ToPlatformCode(this KeyboardKey key) { var field = typeof(KeyboardKey). ToString()); if (RuntimeInformation.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





