Отменить нажатие клавиши в системе

Имеется проблема с клавиатурой - залипла (нажалась и не отжимается) клавиша перехода на следующий трек (VK_MEDIA_NEXT_TRACK). Можно ли как-то программно (с помощью языка С++ или Python) отменить это действие? То есть игнорировать нажатие этой клавиши во всех приложениях (во всей операционной системе)?

Я в С++ разбираюсь плохо, но такого рода программу хотелось написать именно на этом языке (потому что так программа должна получиться более лёгкой), решение на Python меня также устраивает.

На данном этапе написал код, который только определяет нажатые клавиши и выводит их код в консоль:


#include<Windows.h>
#include<iostream>


bool is_key_clicked(unsigned short key_code) {
    return GetAsyncKeyState(key_code) & 0x8000;
}

void click_listener() {
    bool run = true;
    while (run) {
        for (unsigned short i = 0; i < 256; i++) {
        
            if (is_key_clicked(i)) {
                std::cout << "Key " << i << " is pressed." << std::endl;
                if (i == 27) run = false; // 27 is code for "Escape"
            }
        }
    }
}


int main(int argc, char *argv[]) {
    click_listener();
    system("Pause");
    return 0;
}

РЕШЕНИЕ Нашёл решение этой проблемы. Скомпилированная программа весит 13Кб и почти не грузит процессор (в отличие от вышеприведённого кода). Работа программы заключается в том, что если нажатая клавиша имеет код 176, то это нажатие будет проигнорировано. Однако во время использования были замечены проскоки (они происходили после нажатия кнопки Alt, однако было это очень редко).

#include<Windows.h>
#include<iostream>

KBDLLHOOKSTRUCT key;
HHOOK hook;


LRESULT __stdcall HookCallback(int n_code, WPARAM wp, LPARAM lp) {
    
    if (n_code >= 0) {
        if (wp == WM_KEYDOWN) {
            keys = *((KBDLLHOOKSTRUCT*)lp);
            std::cout << "\tKey " << key.vkCode << " was pressed" << std::endl;
            if (key.vkCode == 176) {
                CallNextHookEx(hook, n_code, wp, lp);
                return 1;
            }
        }
    }
    return CallNextHookEx(hook, n_code, wp, lp);
}

int main(int argc, char *argv[]) {  
    
    if (!(hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0))) std::cout << "Hook doesn't work.";
    MSG m;
    while (true) {
        GetMessage(&m, NULL, 0, 0);
    }
    return 0;
}

Ответы (1 шт):

Автор решения: denisnumb

Для Python есть библиотека keyboard (документация).

Можно в несколько строк запретить нажатие с помощью функции add_hotkey()

  1. Первым аргументом принимается код (int) или строковое представление клавиши
  2. Вторым бинд функции при нажатии на эту кнопку. Для "заглушки" можно поставить lambda: None
  3. Нужно указать необязательный параметр suppress=True отвечающий за подавление нажатия этой клавиши во всех других приложениях

Код кнопки -176, однако, если это не сработает, вы можете определить код с помощью кода в самом низу ответа

import keyboard
keyboard.add_hotkey(-176, callback=lambda: None, suppress=True)
keyboard.wait()

Вывод кодов нажатых клавиш:

import keyboard

def print_pressed_keys(e):
    line = ', '.join(str(code) for code in keyboard._pressed_events)
    print('\r' + line + ' '*40, end='')
    
keyboard.hook(print_pressed_keys)
keyboard.wait()

Ну, а вообще, такие проблемы не стоит решать программно. Какой-то костыль получается, как по мне) Мне кажется, проще купить новую клаву

→ Ссылка