Загрузка...

Prohibit button presses?

Thread in C# created by JanitorHvhboom Aug 8, 2023. 199 views

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