Обработка нажатий на клавиатуру для виджета, который не в фокусе. Qt

Как сделать так, чтобы виджет обрабатывал нажатия с клавиатуры даже тогда, когда он не находиться в фокусе? И есть ли возможность скрыть виджет, чтобы он не отображался в панели задач, но был активен и также обрабатывал нажатия с клавиатуры? Использую винду


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

Автор решения: Леонид
#include "windows.h"
#include <iostream>
    
HHOOK hook;

KBDLLHOOKSTRUCT kbStruct;

LRESULT CALLBACK HookCallBack(int nCode, WPARAM wParam, LPARAM lParam)

{
    if (nCode >= 0) {
        kbStruct = *((KBDLLHOOKSTRUCT*)lParam);
        if (wParam == WM_KEYDOWN)     // Клавиша нажата/удерживается
        {
            std::cout << "Key press:   ";
        }
        else if (wParam == WM_KEYUP)   // Клавиша отпущена
        {
            std::cout << "Key release: ";
        }
        std::cout << kbStruct.vkCode << std::endl; // Выводит в консоль номер нажатой клавиши
    }
    return CallNextHookEx(hook, nCode, wParam, lParam);
}

int main()
{
    if (!(hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallBack, NULL, 0)))
    {
        std::cout << "Hook не установлен";
    }

    MSG ms;

    while (true)
    {
        GetMessage(&ms, NULL, 0, 0);
    }

    return 0;
}

Функция HookCallBack срабатывает всякий раз, когда мы что-то делаем с клавиатурой(нажимаем/отпускаем/удерживаем клавишу). Бесконечный цикл необходим, чтобы программа не завершилась сразу. GetMessage хз что делает, но без него в консоль не выводит номер клавиш.

→ Ссылка