MrGobus
@MrGobus
Иван

Как сделать окно игнорирующее нажатия мыши если не зажата клавиша шифт?

Есть окно, что-то вроде виджета, висит по верх экрана и показывает картинку с прозрачностью. Надо как то сделать так, чтобы проходили нажатия только с нажатым шифтом а простые клики передавались окнам снизу.
  • Вопрос задан
  • 206 просмотров
Решения вопроса 1
SerJook
@SerJook
кодер
Если говорить про Windows, то:

Создаете окно с расширенными стилями WS_EX_LAYERED | WS_EX_TRANSPARENT|WS_EX_TOPMOST
Устанавливаете окну степень прозрачности:
SetLayeredWindowAttributes(hWnd, 0, 100, LWA_ALPHA);

Устанавливаете хук на клавиатуру:
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardEvent, hInstance, NULL);

Функция обработки событий клавиатуры (примерный вид):

код
LRESULT CALLBACK KeyboardEvent(int nCode, WPARAM wParam, LPARAM lParam)
{
    if ((nCode == HC_ACTION))
    {
        KBDLLHOOKSTRUCT* hooked_key = (KBDLLHOOKSTRUCT*)lParam; 
        if (hooked_key->vkCode == VK_LSHIFT || hooked_key->vkCode == VK_RSHIFT) {
            bool shiftPressed = (wParam == WM_KEYDOWN);
            LONG oldStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
            if (shiftPressed) {
                SetWindowLong(hWnd, GWL_EXSTYLE, oldStyle & (~WS_EX_TRANSPARENT));
            }
            else {
                SetWindowLong(hWnd, GWL_EXSTYLE, oldStyle | WS_EX_TRANSPARENT);
            }
        }
    }
    return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}

В ней динамически устанавливается и снимается расширенный стиль WS_EX_TRANSPARENT.

При выходе убираете хук:
UnhookWindowsHookEx(hKeyboardHook);
Не знаю, как обойтись без хука, ведь неактивному окну не приходят события клавиатуры.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы