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

HVNC

CCod

(L3) cache
Пользователь
Регистрация
08.01.2022
Сообщения
280
Реакции
60
Всем привет. Пытаюсь реализовать хвнс через CreateDesktop и PrintWindow, но PrintWindow дает максимум 2 фпс, работать невозможно. Если пытаюсь сделать дефолтный скриншот как тут httpx://stackoverflow.com/questions/66091437/c-winapi-taking-screenshot-and-making-it-background-of-window , то черный экран. Как можно избежать вызова PrintWindow?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Всем привет. Пытаюсь реализовать хвнс через CreateDesktop и PrintWindow, но PrintWindow дает максимум 2 фпс, работать невозможно. Если пытаюсь сделать дефолтный скриншот как тут httpx://stackoverflow.com/questions/66091437/c-winapi-taking-screenshot-and-making-it-background-of-window , то черный экран. Как можно избежать вызова PrintWindow?
Ты делал потоки?
 
Всем привет. Пытаюсь реализовать хвнс через CreateDesktop и PrintWindow, но PrintWindow дает максимум 2 фпс, работать невозможно. Если пытаюсь сделать дефолтный скриншот как тут httpx://stackoverflow.com/questions/66091437/c-winapi-taking-screenshot-and-making-it-background-of-window , то черный экран. Как можно избежать вызова PrintWindow?
Для создание скриншотов, есть другой метод.
 
ТС и уточни яп.
сишка
Ты делал потоки?
да конечно, отдельный поток для скриншотов, и именно он тормозит
Для создание скриншотов, есть другой метод.
какой? В созданном десктопе работает?
 
и с PrintWindow должно работать хорошо большенство хв на PrintWindow посмотри у себя может где то утечка озу памяти
 
To improve the performance of screenshot capturing and increase frame rates in your software, I recommend using BitBlt instead of PrintWindow. This function is generally more efficient and faster.
BitBlt :
C++:
HDC hdcScreen = GetDC(NULL); 
HDC hdcMem = CreateCompatibleDC(hdcScreen);
HBITMAP hBitmap = CreateCompatibleBitmap(hdcScreen, width, height); 
SelectObject(hdcMem, hBitmap); 
BitBlt(hdcMem, 0, 0, width, height, hdcScreen, x, y, SRCCOPY);

 
To improve the performance of screenshot capturing and increase frame rates in your software, I recommend using BitBlt instead of PrintWindow. This function is generally more efficient and faster.
BitBlt :
C++:
HDC hdcScreen = GetDC(NULL);
HDC hdcMem = CreateCompatibleDC(hdcScreen);
HBITMAP hBitmap = CreateCompatibleBitmap(hdcScreen, width, height);
SelectObject(hdcMem, hBitmap);
BitBlt(hdcMem, 0, 0, width, height, hdcScreen, x, y, SRCCOPY);

я так и делал, и в обычном десктопе это работает, но если создать новый, то получаю черный экран
 
и с PrintWindow должно работать хорошо большенство хв на PrintWindow посмотри у себя может где то утечка озу памяти
не я профайлером смотрел там именно исполнение PrintWindow очень долго происходит
я тестил хвнц с гитхаба, все что нашел очень плохо работает, единственно у Quasar рат норм работает, но он не создает новый десктоп, а отображает текущий
 
I did this, and it works on a regular desktop, but if I create a new one, I get a black screen
When you call GetDC (NULL) on a non-active desktop, you're essentially requesting the device context of a desktop that isn't being rendered, which results in capturing a black screen. Windows doesn't draw or render content for inactive desktops unless they are switched to and made visible. Use [B]CreateDesktop [/B]to create the new desktop. And Use [B]SwitchDesktop [/B]to make the new desktop visible Ensure you call SetThreadDesktop to associate the current thread with the new desktop.

Ex :
C++:
HDESK hNewDesktop = CreateDesktop(L"XssNewDesktop", NULL, NULL, 0, GENERIC_ALL, NULL);
SetThreadDesktop(hNewDesktop);
SwitchDesktop(hNewDesktop);
HDC hdcScreen = GetDC(NULL); 
HDC hdcMem = CreateCompatibleDC(hdcScreen); 
HBITMAP hBitmap = CreateCompatibleBitmap(hdcScreen, width, height); 
SelectObject(hdcMem, hBitmap); 
BitBlt(hdcMem, 0, 0, width, height, hdcScreen, x, y, SRCCOPY);
DeleteDC(hdcMem);
ReleaseDC(NULL, hdcScreen);

 
Пожалуйста, обратите внимание, что пользователь заблокирован
Как можно избежать вызова PrintWindow?
Глянь готовые сорцы того же тининьюк , или ты принципиально хочешь сам закодить с 0 ?
 
Глянь готовые сорцы того же тининьюк , или ты принципиально хочешь сам закодить с 0 ?
Если самому, тогда и спрашивать не к чему. А так это уже не сам, а с помощью мемберов. С нуля это когда не идиной в коде паблик функции и всего остального в целом. Тернистый путь.
 
Глянь готовые сорцы того же тининьюк , или ты принципиально хочешь сам закодить с 0 ?
там использутеся тот же PrintWindow. я компилил его, но он нормально не работал, виртуалке на которой тестил вроде нормально ресурсов выделил, хз в чем дело
 
Приветствую, тоже сейчас с похожей проблемой разбираюсь, однако у меня еще проблема с получением вывода браузера opera, на других не пробовал, вывод окна на скриншоте получается белым, предполагаю, что это защита от записи экрана, но не как не получается обойти, может кто подскажет? Использую тоже C
 
Приветствую, тоже сейчас с похожей проблемой разбираюсь, однако у меня еще проблема с получением вывода браузера opera, на других не пробовал, вывод окна на скриншоте получается белым, предполагаю, что это защита от записи экрана, но не как не получается обойти, может кто подскажет? Использую тоже C
SetWindowDisplayAffinity

Работает только из процесса который создал окна, т.е. из процесса самого браузера

Решается инжектом длл/шелкода, но у браузера на этот счет помоему тоже есть защита, прибивает все левые потоки
 
SetWindowDisplayAffinity

Работает только из процесса который создал окна, т.е. из процесса самого браузера

Решается инжектом длл/шелкода, но у браузера на этот счет помоему тоже есть защита, прибивает все левые потоки
Спасибо, я добавлю, но у меня это решилось при использовании дополнительных параметров к запуску процесса
 


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