Подскажите пожалуйста, как сделать так, чтобы определенные сосчитания клавиш были заблокированы. Я пытался хукнуть тот же альт+таб, но нихуя не получается, может кто нибудь подкинуть код? Весь гитхаб перерыл. Хукнуть CTRL+A с выводом в окне какого либо сообщения - получилось, а вот альтаб все ещё работает, после сообщения о хуке. Не понимаю........
Кодом не стал кидать, т.к. несколько файлов. Вот ссылка на мой репозиторий: https://github.com/by1ex/AltTabCatcher Краткое описание сервиса: Открываешь приложение, должно открыться окно, на котором кнопка Close. Пока приложение открыто оно перехватывает сочетания Alt+Tab и помечает ивент как обработанный. За обработку хоткеев отвечает класс KeyHook. А изменить сочетание можно в классе Program в методе HandleKeyEvents. После того как закроешь приложение, то перехватывание пропадёт. Пытался написать и описать максимально кратко. Для запуска требуется .NET Desktop Runtime 7.0.1 [STAThread] static void Main() { using KeyHook keyHook = new KeyHook(); keyHook.KeyEvent += HandleKeyEvents; ApplicationConfiguration.Initialize(); Application.Run(new Form1()); } // Метод с сочетанием клавиш public static void HandleKeyEvents(KeyHookEventArgs e) { if (e.Key == (Keys.Alt | Keys.Tab)) { e.Handled = true; } } CSHARP [STAThread] static void Main() { using KeyHook keyHook = new KeyHook(); keyHook.KeyEvent += HandleKeyEvents; ApplicationConfiguration.Initialize(); Application.Run(new Form1()); } // Метод с сочетанием клавиш public static void HandleKeyEvents(KeyHookEventArgs e) { if (e.Key == (Keys.Alt | Keys.Tab)) { e.Handled = true; } } Что интересно, так Windows Defender блокирует программу как вирус, хотя VT зелёный. https://www.virustotal.com/gui/file/ec111104413eb0d50fcebc06fb6758805cc7ae002bf336f8d9f8fae5cc398fa8 В любом случае репозиторий у тебя есть можешь сам изменить и собрать как хочешь.
bylex, Все работает, все что нужно блокирует, осталось только понять как код работает, пиздец там конечно написано))
В гугле полно примеров,да даже у той же нейронки спроси он тебе выдаст, перепиши под себя. Пример: (коды клавиш смотри в интернете https://snipp.ru/handbk/vk-code ) using System; using System.Runtime.InteropServices; using System.Windows.Forms; class Program { private const int WH_KEYBOARD_LL = 13; private const int WM_KEYDOWN = 0x0100; private const int VK_MENU = 0x12; // Код клавиши Alt private const int VK_Z = 0x5A; // Код клавиши Z private static IntPtr hookId = IntPtr.Zero; private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) { int vkCode = Marshal.ReadInt32(lParam); if (vkCode == VK_Z && (Control.ModifierKeys & Keys.Alt) != 0) { // Запрет обработки комбинации Alt + Z return (IntPtr)1; } } return CallNextHookEx(hookId, nCode, wParam, lParam); } [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); static void Main() { // Установка хука using (ProcessModule curModule = Process.GetCurrentProcess().MainModule) { hookId = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, GetModuleHandle(curModule.ModuleName), 0); } // Ожидание нажатия клавиши для завершения программы Console.WriteLine("Press any key to exit..."); Console.ReadKey(); // Удаление хука UnhookWindowsHookEx(hookId); } private static IntPtr GetModuleHandle(string lpModuleName) { IntPtr hModule = IntPtr.Zero; ProcessModuleCollection modules = Process.GetCurrentProcess().Modules; foreach (ProcessModule module in modules) { if (module.ModuleName == lpModuleName) { hModule = module.BaseAddress; break; } } return hModule; } } CSHARP using System; using System.Runtime.InteropServices; using System.Windows.Forms; class Program { private const int WH_KEYBOARD_LL = 13; private const int WM_KEYDOWN = 0x0100; private const int VK_MENU = 0x12; // Код клавиши Alt private const int VK_Z = 0x5A; // Код клавиши Z private static IntPtr hookId = IntPtr.Zero; private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) { int vkCode = Marshal.ReadInt32(lParam); if (vkCode == VK_Z && (Control.ModifierKeys & Keys.Alt) != 0) { // Запрет обработки комбинации Alt + Z return (IntPtr)1; } } return CallNextHookEx(hookId, nCode, wParam, lParam); } [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); static void Main() { // Установка хука using (ProcessModule curModule = Process.GetCurrentProcess().MainModule) { hookId = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, GetModuleHandle(curModule.ModuleName), 0); } // Ожидание нажатия клавиши для завершения программы Console.WriteLine("Press any key to exit..."); Console.ReadKey(); // Удаление хука UnhookWindowsHookEx(hookId); } private static IntPtr GetModuleHandle(string lpModuleName) { IntPtr hModule = IntPtr.Zero; ProcessModuleCollection modules = Process.GetCurrentProcess().Modules; foreach (ProcessModule module in modules) { if (module.ModuleName == lpModuleName) { hModule = module.BaseAddress; break; } } return hModule; } }
JanitorHvhboom, покажи код, выложи проект, код то рабочий, моментами где то что то подправить и норм.