Если говорить про 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);
Не знаю, как обойтись без хука, ведь неактивному окну не приходят события клавиатуры.