Захват окна, которое скрыто или свернуто - PullRequest
8 голосов
/ 06 мая 2009

Я следовал этому учебнику (это немного больше, чем то, что перечислено здесь, потому что в моем коде я получаю окно с помощью щелчка мыши) для захвата окна как растрового изображения, а затем рендеринга этого растрового изображения в другом окне ,

Мой вопрос:

Когда это окно свернуто или скрыто (SW_HIDE), мой снимок экрана не работает, поэтому возможно ли захватить окно, когда оно свернуто или скрыто?

Ответы [ 3 ]

6 голосов
/ 07 мая 2009

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;
    }
1 голос
/ 06 мая 2009

В это окно можно отправить WM_PRINT и WM_PRINTCLIENT сообщения, в результате чего его содержимое будет преобразовано в HDC по вашему выбору.

Однако они не идеальны: хотя стандартные элементы управления Win32 обрабатывают их правильно, любые пользовательские элементы управления в приложении могут не работать.

0 голосов
/ 17 июня 2011

Я пытаюсь получить растровое изображение частично скрытых элементов управления.

Я использовал код до того, как рисовал, но включал окна, перекрывающие его. Так что .. может быть, вы хотите попробовать это. WM_PRINTCLIENT должен (в моем понимании) перерисовать все внутри элемента управления, даже если он на самом деле не виден.

const int WM_PRINT = 0x317, WM_PRINTCLIENT = 0x318, PRF_CLIENT = 4,
PRF_CHILDREN = 0x10, PRF_NON_CLIENT = 2,
COMBINED_PRINTFLAGS = PRF_CLIENT | PRF_CHILDREN | PRF_NON_CLIENT;
SendMessage(handle, WM_PRINTCLIENT, (int)hdc, COMBINED_PRINTFLAGS);
//GDIStuff.BitBlt(hdc, 0, 0, width, height, hdcControl, 0, 0, (int)GDIStuff.TernaryRasterOperations.SRCCOPY);

Предыдущий код закомментирован сейчас. Он основан на коде, найденном здесь: Pocket PC: отрисовка элемента управления на растровое изображение (принятый ответ). По сути, это то же самое, что предлагает Тим ​​Робинсон в этой теме.

Кроме того, посмотрите здесь http://www.tcx.be/blog/2004/paint-control-onto-graphics/

...