Определить, является ли окно видимым с высоким ЦП - PullRequest
0 голосов
/ 08 мая 2019

Фон

Я пытаюсь сделать снимок экрана конкретного окна, однако операционная система, в которой мне нужно это сделать, имеет очень высокую загрузку ЦП, и иногда мое приложение определяет это окно как видимое, однако на скриншоте оно либо не отображается, либо наполовину прорисовано.

Мое понимание

Поскольку загрузка ЦП очень высока, он не сможет предоставить достаточно ресурсов процессу, который открывает это конкретное окно. Поэтому проверка видимости окна успешна, это может означать, что окно было инициировано для создания, но еще не нарисовано (учитывая нехватку ресурсов).

Мой код

HWND hWnd = FindWindowExA(0, 0, NULL, programdata->caption);
if (hWnd)
{
    if (IsWindowVisible(hWnd))
    {
        RECT rect = { 0 };
        GetWindowRect(hWnd, &rect);

        // if window size also matches requirement then
        TakeScreenshot();

Вопрос

Есть ли какой-нибудь лучший способ определить, было ли окно полностью нарисовано и видно ли человеческому глазу?

1 Ответ

2 голосов
/ 08 мая 2019

если окно было полностью нарисовано и видно человеческому глазу?

Чтобы сделать скриншот, вам не нужно, чтобы окно было видно. Вам нужно только скопировать из его контекста. Так что просто сделайте GetWindowDC() и используйте его.

Если вам действительно нужно проверить, «видимы ли они человеческому глазу», вы также должны убедиться, что окно находится сверху Z-порядка. В противном случае оно может быть перекрыто каким-либо другим окном.

Если вы хотите проверить, было ли окно полностью перекрашено, вы можете проверить его значение GetUpdateRect().

...