• XSS.stack #1 – первый литературный журнал от юзеров форума

PrintWindow Api. Win7

Haunt

PWSH
Эксперт
Регистрация
07.11.2019
Сообщения
948
Решения
1
Реакции
1 266
Вопрос к знающим. PrintWindow winapi на вин 7 не рисует некоторые приложения(чёрный квадрат). К примеру хром. При чем, если в цикле прогнать этот момент, то выходит почти 1/2 чёрные скрины и 1/2 таки отрисовует. Почитал некоторые ресурсы, пишут что хром рисует себя асинхронно, то есть судя по всему эта апи не дожидается отрисовки, по этому битмап иногда чёрный на выходе.
Что интересно, в вин 10 такой проблемы нет(пробовал по разному, передавая в PrintWindow последним аргументом и 0х2 и 0). На вин 7 флага 0х2 попросту нет. Частичным выходом для себя нашёл простой чек кадра и его пикселей на R - 0 G - 0 B - 0 и пропуском, если картинка на выходе чёрная. Но может кто знает более тру способ? BitBlt и dwmthumbnail и что рисует только в пределах десктопа не предлагать
 
Вопрос к знающим. PrintWindow winapi на вин 7 не рисует некоторые приложения(чёрный квадрат). К примеру хром. При чем, если в цикле прогнать этот момент, то выходит почти 1/2 чёрные скрины и 1/2 таки отрисовует. Почитал некоторые ресурсы, пишут что хром рисует себя асинхронно, то есть судя по всему эта апи не дожидается отрисовки, по этому битмап иногда чёрный на выходе.
Что интересно, в вин 10 такой проблемы нет(пробовал по разному, передавая в PrintWindow последним аргументом и 0х2 и 0). На вин 7 флага 0х2 попросту нет. Частичным выходом для себя нашёл простой чек кадра и его пикселей на R - 0 G - 0 B - 0 и пропуском, если картинка на выходе чёрная. Но может кто знает более тру способ? BitBlt и dwmthumbnail и что рисует только в пределах десктопа не предлагать

Причина простая, в этом АПИ вызывается сообщение в приложение WM_PRINT и забирается изображение, саму команду WM_PRINT и изображение выполняет само приложение, т.е. в нашем случае ХРОМ. НО!!!!!! в Хроме отключено выполнение WM_PRINT от внешних приложения, т.е. для того чтобы данная команда отработала тебе надо сделать инжект (к примеру) или промэпировал длл в приложение ХРОМА и посылать WM_PRINT своему коду тот уже должен отсылать данное сообщение приложения и тогда приложение посчитает что сообщение пришло от него же и сформирует изображение. Пример такой обратотки есть в HVNC.
 
в Хроме отключено выполнение WM_PRINT от внешних приложения,
В том то и дело, что PrintWindow тогда бы совсем не работал по логике. А так он рисует через раз. Без этих манипуляций что ты описал. На вин 10 так вообще рисует постоянно, без сбоев и доп манипуляций
 
В том то и дело, что PrintWindow тогда бы совсем не работал по логике. А так он рисует через раз. Без этих манипуляций что ты описал. На вин 10 так вообще рисует постоянно, без сбоев и доп манипуляций
Я так понял зависит от ОС, используется хардварное ускорение или нет. Может просто утечка в вин7 при вызове и случайно попадаешь на изображение. А вообще странно, когда я делал тесты то там надо с бубном все смотреть, но вышеописанная техника работает четко, кстати если отрубаешь ускорение графики.
 
Попробуй открубить ускорение через консоль у Хрома и тестани софт еще раз

--disable-3d-apis --disable-gpu --disable-d3d11
 
Последнее редактирование:
119FAE0B-1C56-4D57-9FFC-F6988E15FCC6.png


Не фурычит. Видео, о чем я говорю.
--disable-3d-apis --disable-gpu --disable-d3d11

Слева на видео форма, куда рисую битмап в picturebox, полученный с формы с хромом справа, с помощью printwindow. Задержка в цикле 100мс между каждым рендерингом кадра.
 
Последнее редактирование:
Посмотреть вложение 7417

Не фурычит. Видео, о чем я говорю.


Слева на видео форма, куда рисую битмап в picturebox, полученный с формы с хромом справа, с помощью printwindow. Задержка в цикле 100мс между каждым рендерингом кадра.

я тестил этот вариант --no-sandbox --allow-no-sandbox-job --disable-3d-apis --disable-gpu --disable-d3d11

на вин 7 х64 проблем не было

Попробуй еще вот такой код с прорисовкой (на c++ переделаешь короче):
Код:
BOOL PrintWindowEx(HWND hWnd, HDC hDC, UINT dwFlags)
{
    BOOL bRet = FALSE;

    int i;
    for (i = 0; i <= 10; i++)
    {
        if (!IsWindow(hWnd))
            break;

        RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
        if (PrintWindow(hWnd, hDC, dwFlags))
        {
            bRet = TRUE;
            break;
        }
        Sleep(0);
    }

    return bRet;
}
 
я тестил этот вариант --no-sandbox --allow-no-sandbox-job --disable-3d-apis --disable-gpu --disable-d3d11

на вин 7 х64 проблем не было

Попробуй еще вот такой код с прорисовкой (на c++ переделаешь короче):
Код:
BOOL PrintWindowEx(HWND hWnd, HDC hDC, UINT dwFlags)
{
    BOOL bRet = FALSE;

    int i;
    for (i = 0; i <= 10; i++)
    {
        if (!IsWindow(hWnd))
            break;

        RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
        if (PrintWindow(hWnd, hDC, dwFlags))
        {
            bRet = TRUE;
            break;
        }
        Sleep(0);
    }

    return bRet;
}
Переписал пример на powershell и внедрил- не воркает(эффект как и прежде). До твоего примера пробовал почти так же, в цикле запускать PrintWindow пока не вернет true. Тут прикол по всей видимости в том, что рисует чёрный bitmap, даже если PrintWindow возвращает true. По этому эффект не изменился от такого дополнительного слоя. Так же через раз рисует. RedrawWindow не дал ничего. Попробую ещё на плюсах собрать, проверить, но сомневаюсь что что-то поменяется. И кста —no-sandbox параметра нет, хром окошко выдал. То ли депрекейтед то ли че, не помню
 
Переписал пример на powershell и внедрил- не воркает(эффект как и прежде). До твоего примера пробовал почти так же, в цикле запускать PrintWindow пока не вернет true. Тут прикол по всей видимости в том, что рисует чёрный bitmap, даже если PrintWindow возвращает true. По этому эффект не изменился от такого дополнительного слоя. Так же через раз рисует. RedrawWindow не дал ничего. Попробую ещё на плюсах собрать, проверить, но сомневаюсь что что-то поменяется. И кста —no-sandbox параметра нет, хром окошко выдал. То ли депрекейтед то ли че, не помню
они там эти параметры меняю каждый месяц )

Ну код выше который тебе дал - я проверял работал как надо без проблем я проверял, даже не знаю что еще посоветовать.
 
они там эти параметры меняю каждый месяц )

Ну код выше который тебе дал - я проверял работал как надо без проблем я проверял, даже не знаю что еще посоветовать.
То есть ты сначала говоришь, что хром без инжекта в него не рисует у тебя, потом говоришь, что по сути этот код, что выше, у тебя норм рисует хром на win7 x64 без доп манипуляций. Чет я совсем запутался, что ты имеешь ввиду. Давай так, ты проверил и у тебя работает кусок кода что ты кинул на win7 х64 без доп манипуляций в виде инжектов или это только предположения твои что возможно так будет работать?) уточни, плз
 
То есть ты сначала говоришь, что хром без инжекта в него не рисует у тебя, потом говоришь, что по сути этот код, что выше, у тебя норм рисует хром на win7 x64 без доп манипуляций. Чет я совсем запутался, что ты имеешь ввиду. Давай так, ты проверил и у тебя работает кусок кода что ты кинул на win7 х64 без доп манипуляций в виде инжектов или это только предположения твои что возможно так будет работать?) уточни, плз
Этот код универсален, он в инжекте тоже используется. Там просто для хрома он вызывается в адресном пространстве хрома. Проверить еще раз могу, чуть позже скину что получилось.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх