Изображение WPF не будет отображать BitmapSource - PullRequest
2 голосов
/ 15 ноября 2009

Я новичок в использовании WPF и GDI, и у меня возникают проблемы с отображением изображения. Моя конечная цель - создать что-то похожее на экспозицию. До сих пор я затенял экраны, собрал все активные HWND и захватил экраны всех окон. На данный момент у меня есть один элемент Image, для которого я пытаюсь установить источник, но ничего не появляется.

foreach (IntPtr hwnd in hwndlist)
{
    IntPtr windowhdc = GetDC((IntPtr) hwnd);
    IntPtr bmap = CreateBitmap(400, 400, 1, 32, null);
    IntPtr bitmaphdc = GetDC(bmap);
    BitBlt(bitmaphdc, 0, 0, System.Convert.ToInt32(this.Width), System.Convert.ToInt32(this.Height), windowhdc, 0, 0, TernaryRasterOperations.SRCCOPY);
    ReleaseDC(hwnd, windowhdc);
    BitmapSource bmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bmap, IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
    image1.Source = bmapSource;
    image1.BeginInit();
}

Полный код здесь:
http://pastebin.com/m70af590 - код
http://pastebin.com/m38966750 - xaml

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

Я пытался жестко кодировать HWND видимого окна, и оно все равно не будет работать.

Спасибо за любую помощь!

1 Ответ

1 голос
/ 15 ноября 2009

Я думаю, что работа с Memory DC решит вашу проблему. Для этого сначала импортируйте:

[DllImport("gdi32.dll", EntryPoint = "CreateCompatibleDC")]
public static extern IntPtr CreateCompatibleDC(IntPtr hdc);

[DllImport("gdi32.dll", EntryPoint = "SelectObject")]
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);

[DllImport("gdi32.dll",EntryPoint="DeleteDC")]
public static extern IntPtr DeleteDC(IntPtr hDc);

И вместо этого:

IntPtr bitmaphdc = GetDC(bmap);
BitBlt(bitmaphdc, 0, 0, System.Convert.ToInt32(this.Width), System.Convert.ToInt32(this.Height), windowhdc, 0, 0, TernaryRasterOperations.SRCCOPY);

Сделайте это:

IntPtr memdc = CreateCompatibleDC(windowhdc);
SelectObject(memdc, bmap);

BitBlt(memdc, 0, 0, System.Convert.ToInt32(this.Width), System.Convert.ToInt32(this.Height), windowhdc, 0, 0, TernaryRasterOperations.SRCCOPY);

Не забудьте удалить Memort DC позже:

DeleteDC(memdc);

И кстати, вам не нужно image1.BeginInit();.

Также, чтобы проверить, вам не нужно перечислять все окна. Вместо этого используйте GetDesktopWindow метод из user32.dll.

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