Изображения в WPF не отображается объект bitmapsource



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



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 видимого окна, и это все еще не работает.



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

609   1  

1 ответ:

Я думаю, что работа с памятью 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.

Comments

    Ничего не найдено.