Загрузка...

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

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

Загрузка...
  1. JanitorHvhboom
    JanitorHvhboom Автор темы 8 авг 2023 хочу работать. 32 4 апр 2018
    Подскажите пожалуйста, как сделать так, чтобы определенные сосчитания клавиш были заблокированы. Я пытался хукнуть тот же альт+таб, но нихуя не получается, может кто нибудь подкинуть код? Весь гитхаб перерыл. Хукнуть CTRL+A с выводом в окне какого либо сообщения - получилось, а вот альтаб все ещё работает, после сообщения о хуке. Не понимаю........
     
  2. bylex
    bylex 8 авг 2023 Безделье - это игрушка дьявола 3072 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 Автор темы
      bylex, Все работает, все что нужно блокирует, осталось только понять как код работает, пиздец там конечно написано))
  3. r3xq1
    В гугле полно примеров,да даже у той же нейронки спроси он тебе выдаст, перепиши под себя.
    Пример: (коды клавиш смотри в интернете 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