Нужна помощь с чисткой многослойных окон - PullRequest
2 голосов
/ 22 марта 2011

Я пытаюсь очистить (сделать снимок экрана) многослойное окно, и оно, кажется, не работает правильно. Некоторые многослойные окна работают нормально, а некоторые нет. Вот как я это делаю:

IntPtr display_dc = GetDC(IntPtr.Zero);
IntPtr bitmap_dc = CreateCompatibleDC(display_dc);
IntPtr bitmap = CreateCompatibleBitmap(display_dc, rect.Width, rect.Height);
IntPtr null_bitmap = SelectObject(bitmap_dc, bitmap);

IntPtr window_dc = GetWindowDC(Handle);
BitBlt(bitmap_dc, 0, 0, rect.Width, rect.Height, window_dc, 0, 0, 
    TernaryRasterOperations.SRCCOPY | TernaryRasterOperations.SRCPAINT);

ReleaseDC(Handle, window_dc);
SelectObject(bitmap_dc, null_bitmap);
DeleteDC(bitmap_dc);

using (Bitmap temp = Bitmap.FromHbitmap(bitmap))
{
     temp.Save(String.Format(@"C:\{0}_test.bmp", Handle.ToString("x")));
}

DeleteObject(bitmap);
ReleaseDC(IntPtr.Zero, display_dc);

Проблема в том, что я получаю правильные изображения для окон, созданных через SetLayeredWindowAttributes, и черное растровое изображение, когда многоуровневое окно обновляется через UpdateLayeredWindow. Может кто-нибудь сказать мне, есть ли у нас способ очистки слоистых окон, обновленных с помощью UpdateLayeredWindow win api call?

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

TIA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...