API PrintWindow работает хорошо, я использую его для захвата миниатюр для скрытых окон. Несмотря на название, оно отличается от WM_PRINT и WM_PRINTCLIENT, оно работает практически со всеми окнами, кроме окон Direct X / WPF.
Я добавил некоторый код (C #), но после просмотра того, как я использовал код, я понял, что окно на самом деле не скрыто, когда я записываю его растровое изображение, оно просто за пределами экрана, поэтому это может не сработать для вашего случая. Не могли бы вы показать окно за окном, сделать распечатку, а затем скрыть ее снова?
public static Bitmap PrintWindow(IntPtr hwnd)
{
RECT rc;
WinUserApi.GetWindowRect(hwnd, out rc);
Bitmap bmp = new Bitmap(rc.Width, rc.Height, PixelFormat.Format32bppArgb);
Graphics gfxBmp = Graphics.FromImage(bmp);
IntPtr hdcBitmap = gfxBmp.GetHdc();
bool succeeded = WinUserApi.PrintWindow(hwnd, hdcBitmap, 0);
gfxBmp.ReleaseHdc(hdcBitmap);
if (!succeeded)
{
gfxBmp.FillRectangle(new SolidBrush(Color.Gray), new Rectangle(Point.Empty, bmp.Size));
}
IntPtr hRgn = WinGdiApi.CreateRectRgn(0, 0, 0, 0);
WinUserApi.GetWindowRgn(hwnd, hRgn);
Region region = Region.FromHrgn(hRgn);
if (!region.IsEmpty(gfxBmp))
{
gfxBmp.ExcludeClip(region);
gfxBmp.Clear(Color.Transparent);
}
gfxBmp.Dispose();
return bmp;
}