Задать вопрос
@mardokvk
Я junior-программист, мой профиль С#, изучаю С++.

Возможно ли сделать скрин действующего окна через Alt + PrtSc на С++?

Если я делаю попытку сделать скриншот определенного окна через его HWND и это приложение использует видеопамять, на скринах я получаю черный экран. Если я скриню весь экран и вырезаю только нужно мне область всё ок. Но есть функция Alt + PrtSc которая делает скриншот активного окна, вне зависимости от того использует приложение видеопамять или нет. И вот вопрос, могу ли я делать скриншоты приложений использующие видеопамять без внедрения своей DLL в видеопамять, без обрезания всего рабочего стола получаю размер нужного мне окна через RECT полученный через HWND, а просто через встроенную функцию Windows Alt + PrtSc? И я надеюсь не на комбинацию клавиш через симуляцию нажатий а на метод или может что-то такое... Поделитесь пожалуйста информацией и мыслями по этому поводу.

HBITMAP CreateBMPScreen(Gdiplus::Point ptWin, Gdiplus::Point sizeWin) {
	HDC scrdc = GetDC(0); // Это я получаю DC рабочего стола, если поставлю сюда HWND приложения использующего видеопамять, будет чёрный экран на скрине

	int Height = GetSystemMetrics(SM_CYSCREEN), Width = GetSystemMetrics(SM_CXSCREEN);

	if (hWnd != NULL) {
		ShowWindow(hWnd, SW_SHOWNORMAL);
		SetForegroundWindow(hWnd);
		SetWindowPos(hWnd, NULL, ptWin.X, ptWin.Y, sizeWin.X, sizeWin.Y, SWP_NOSIZE | SWP_NOZORDER);
		GetWindowRect(hWnd, &rect);
	}
	Sleep(250);
	SpaceButtonClick();

	HDC memdc = CreateCompatibleDC(scrdc);
	HBITMAP membit = CreateCompatibleBitmap(scrdc, rect.right + 8, rect.bottom + 31);
	SelectObject(memdc, membit);
	BitBlt(memdc, 0, 0, rect.right + 8, rect.bottom + 31, scrdc, rect.left, rect.top, SRCCOPY);
	HBITMAP hBitmap = (HBITMAP)SelectObject(memdc, membit);
	ShowWindow(hWnd, SW_MINIMIZE);

	return hBitmap;
}
  • Вопрос задан
  • 136 просмотров
Подписаться 1 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Академия Эдюсон
    Разработчик игр на Unreal Engine + ИИ
    9 месяцев
    Далее
  • Stepik
    Профессия: Разработчик C++ (Junior)
    2 месяца
    Далее
Пригласить эксперта
Ответы на вопрос 2
opium
@opium
Просто люблю качественно работать
PrintWindow() с флагом PW_RENDERFULLCONTENT, доступен с Win8.1. Ровно то что Alt+PrtSc делает под капотом — DWM рисует DirectX-слой без хуков в видеопамять:
PrintWindow(hWnd, hdc, PW_RENDERFULLCONTENT);
p.s. и rect.right+8 в CreateCompatibleBitmap у тебя не ширина, а координата, размер будет кривой.
Ответ написан
BrainMasterBob
@BrainMasterBob
Предприниматель
Попробуй PrintWindow(hWnd, hdcMem, PW_CLIENTONLY). Она отрисует окно через его собственный WM_PRINT.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы