Я пытаюсь написать копию того, как периодически выглядит окно моего приложения.Все работает нормально, если окно нормализовано, т. Е. На столе.Но если окно свернуто, я получаю только свернутую панель команд.
Я пробовал разные подходы, используя SendMessage с WM_PRINT и PrintWindow, но безуспешно.В следующем коде, использующем SendMessage, я знаю, что для создания растрового изображения используется правильный размер нормализованного окна.Я знаю, что обработка по умолчанию для WM_PRINT через DefWindowProc генерирует сообщение WM_PRINTCLIENT.hWnd - это дескриптор свернутого окна.
HDC scrdc, memdc;
HBITMAP membit;
WINDOWPLACEMENT WP;
EncoderParameters encoderParameters;
ULONG quality;
Status status;
RECT Rect;
WP.length = sizeof (WP);
WP.flags = 0;
WP.showCmd = 0;
GetWindowPlacement (hWnd, &WP);
int WPHeight = WP.rcNormalPosition.bottom - WP.rcNormalPosition.top;
int WPWidth = WP.rcNormalPosition.right - WP.rcNormalPosition.left;
scrdc = GetWindowDC (hWnd); // source DC
GetWindowRect(hWnd,&Rect); // source Rectangle
int Height = Rect.bottom-Rect.top; // source height
int Width = Rect.right-Rect.left; // source width
if (WP.showCmd == SW_SHOWMINIMIZED)
{
Height = WPHeight;
Width = WPWidth;
}
memdc = CreateCompatibleDC(scrdc); // destination DC
membit = CreateCompatibleBitmap(scrdc, Width, Height); // destination bitmap
HBITMAP hOldBitmap =(HBITMAP) SelectObject(memdc, membit); // add bitmap to DC
// copy screen to new BitMap
// BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
// PrintWindow (hWnd, memdc, 0);
BitBlt
(
memdc,
0,
0,
GetDeviceCaps(memdc,HORZRES),
GetDeviceCaps(memdc,VERTRES),
NULL,
NULL,
NULL,
WHITENESS
);
SendMessage (hWnd, WM_PRINT, unsigned int (memdc), PRF_CLIENT|PRF_NONCLIENT);
А вот код для обработчиков WM_PRINT, WM_PRINTCLIENT и WM_PAINT
case WM_PRINT:
return DefWindowProc (hWnd, message, wParam, lParam);
case WM_PRINTCLIENT:
Screen.WMPrint (hWnd, HDC (wParam), NULL);
return true;
return DefWindowProc (hWnd, message, wParam, lParam);
case WM_PAINT:
Screen.WMPaint (hWnd);
break;
Я также знаю, что Screen.WMPrint пишетправильные вещи в HDC.
Так что, если кто-нибудь может дать мне несколько советов или предложить подход, я был бы очень признателен.Я мог бы использовать Screen.WMPaint, но тогда я получаю только клиентскую область и пропускаю панель команд и границы.
Я не хочу нормализовать окно, так как это раздражает пользователя.