Загрузка...

Запрет нажатия кнопок?

Тема в разделе C# создана пользователем JanitorHvhboom 8 авг 2023. 198 просмотров

  1. JanitorHvhboom
    JanitorHvhboom Автор темы 8 авг 2023 хочу работать. 32 4 апр 2018
    Подскажите пожалуйста, как сделать так, чтобы определенные сосчитания клавиш были заблокированы. Я пытался хукнуть тот же альт+таб, но нихуя не получается, может кто нибудь подкинуть код? Весь гитхаб перерыл. Хукнуть CTRL+A с выводом в окне какого либо сообщения - получилось, а вот альтаб все ещё работает, после сообщения о хуке. Не понимаю........
     
  2. bylex
    bylex 8 авг 2023 Безделье - это игрушка дьявола 3496 7 апр 2019
    Кодом не стал кидать, т.к. несколько файлов. Вот ссылка на мой репозиторий:
    https://github.com/by1ex/AltTabCatcher
    Краткое описание сервиса:
    Открываешь приложение, должно открыться окно, на котором кнопка Close. Пока приложение открыто оно перехватывает сочетания Alt+Tab и помечает ивент как обработанный. За обработку хоткеев отвечает класс KeyHook. А изменить сочетание можно в классе Program в методе HandleKeyEvents. После того как закроешь приложение, то перехватывание пропадёт.
    Пытался написать и описать максимально кратко.
    Для запуска требуется .NET Desktop Runtime 7.0.1
    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
    В любом случае репозиторий у тебя есть можешь сам изменить и собрать как хочешь.
     
    8 авг 2023 Изменено
    1. JanitorHvhboom Автор темы
    2. JanitorHvhboom Автор темы
      bylex, Все работает, все что нужно блокирует, осталось только понять как код работает, пиздец там конечно написано))
  3. r3xq1
    r3xq1 8 авг 2023 54 27 июл 2018
    В гугле полно примеров,да даже у той же нейронки спроси он тебе выдаст, перепиши под себя.
    Пример: (коды клавиш смотри в интернете https://snipp.ru/handbk/vk-code )
    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;
    }
    }
     
    1. JanitorHvhboom Автор темы
      r3xq1, Так вот именно, я делал так, но в итоге перехватывать не получалось.
    2. r3xq1
      JanitorHvhboom, покажи код, выложи проект, код то рабочий, моментами где то что то подправить и норм.
Загрузка...
Top