Nieaktywne okno programu a funkcja BitBlt.

0

Witam, uruchamiam grę w trybie "pełny ekran w oknie", oraz mój program.
Gdy okno gry jest aktywne, wciskam ustalony przycisk(załóżmy załóżmy strzałkę w dół) i i mój program zaczyna wykonywać poniższą funkcje.

 void Screen(HWND &uchwyt, int &szerokosc_okna, int &wysokosc_okna )
{
    HDC uchwyt_DC = GetWindowDC(uchwyt);
    HDC uchwyt_Compatible_DC = CreateCompatibleDC(uchwyt_DC);
    HBITMAP uchwyt_bitmapy = CreateCompatibleBitmap(uchwyt_DC, szerokosc_okna, wysokosc_okna);
    SelectObject( uchwyt_Compatible_DC, uchwyt_bitmapy);
    BitBlt(uchwyt_Compatible_DC,               //
           0, 0,                               //tu program sie zatrzymuje
           szerokosc_okna, wysokosc_okna,      //czeka do momentu zminimalizowania okna gry
           uchwyt_DC,                          //po czym wznawia prace
           0, 0,                               //
           SRCCOPY);                           //
}

Problem w tym, że program zatrzymuje się na funkcji BitBlt i dopiero gdy wyjdę z okienka gry, wznawia prace. Ostatecznie otrzymuje screena z chwili w której naciskam alt+Tab, a nie z momentu naciśnięcia strzałki.
Problem nie występuje jeśli pobiorę uchwyt np. systemowego notatnika.

Czy ktoś może mi powiedzieć dlaczego tak się dzieje?

0

uruchamiam grę w trybie "pełny ekran w oknie"
co to znaczy? w jaki sposób? pokaż kod jak otwierasz okno.

0

Chodzi o ręczne uruchomienie gry... Nic specjalnego. Klikam dwukrotnie na ikonkę gry i się uruchamia. Gra ma opcjach grafiki trzy możliwe tryby uruchomienia: "pełny ekran", "pełny ekran w oknie" lub po prostu "w oknie". Z "pełnego ekranu" nie umiem przechwycić obrazu, tylko z tych dwóch ostatnich.
Gra rzecz jasna nie jest moja i chodzi mi tylko o to abym w trakcie korzystania z niej mógł zrobić sobie screena. Jednak tak jak powiedziałem mój program (to co pokazałem to tylko funkcja w której jest problem) przechwytuje obraz dopiero gdy minimalizuje okno gry, pomimo że funkcja Screen się uruchamia(sprawdziłem) i zatrzymuje na BitBlt(też sprawdziłem).

0

Masz poważny wyciek. uchwyt_DC powinien być zwolniony (ReleaseDC), a uchwyt_Compatible_DC i uchwyt_bitmapy usunięty odpowiednio funkcjami DeleteDC i DeleteObject.

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