Reakcja na Alt+Tab

0

Załóżmy, że moje okno jest na wierzchu, oraz jest aktywne (ma focus). Teraz użytkownik używa Alt+Tab przełączając się na inne okno (lub minimalizując moje). Jak to wykryć by móc wykonać jakąś operację, np. wstrzymać działanie renderingu itp?

Próbowałem przechwytywać WM_SYSKEYUP, sprawdzać czy został wciśnięty Tab, a jeśli tak to potem w WM_ACTIVATEAPP pauzować rendering (jeśli WPARAM == 0). Niestety aplikacja wykrywa tylko wciśnięcie i puszczenie samego klawisza Alt, kombinacji z tabulatorem już nie.

1

Opcja 1.
masz dwie flagi, na alt i na tab, kiedy dostajesz event o wciśnięciu któregoś z przycisków ustawiasz odpowiednia flage na jeden, kiedy złapiesz event zwolnienia puszczenia któregoś z nich, ustawiasz flagę na zero. Kiedy obie są równe jeden blokujesz render do momentu az nie przyjdzie event z informacją że app dostała focus.

Opcja 2.
łapiesz dwa eventy:
WM_KILLFOCUS - kiedy app taci focus w dowolny sposób, od tego momentu pauzujesz render.
WM_ACTIVATE + wParam = WA_INACTIVE - app odzyskało focus, włączasz render.

Opcja 1. zadziała tylko dla ALT+TAB, opcja 2 w kazdym przypadku gdy app traci focus.

0

Chcę pauzować renderowanie tylko, gdy aplikacja jest zminimalizowana. Nie było problemu, gdy minimalizowałem ją ręcznie przyciskiem lub z poziomu menu systemowego. Problem pojawiał się, gdy aplikacja działała na pełnym ekranie i wcisnąłem Alt+Tab by ją zminimalizować.

Trochę nakombinowałem, zanim wpadłem na prostsze rozwiązanie: w komunikacie WM_ACTIVATEAPP sprawdzam, czy w trakcie deaktywacji aplikacja działa na pełnym ekranie, jeśli tak - wstrzymuję renderowanie. Zastanawia mnie natomiast, czemu zaproponowałeś użycie WM_ACTIVATE, a nie WM_ACTIVATEAPP?

1

Taki prosty kod zebys zczail o co chodzi

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

#pragma comment(lib,"user32.lib")

using namespace std;

int main()
{
    while(true)
    {
        if((GetAsyncKeyState(0x12) & 0x8000) && (GetAsyncKeyState(0x09) & 0x8000)) cout << "Alt+Tab\n"; // 0x8000 oznacza ze klawisz jest wcisniety
        _sleep(1);
    }
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1