Изображения в 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 видимого окна, и это все еще не работает.
Спасибо за любую помощь!
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