Изображение WPF не отображает BitmapSource
-
20-09-2019 - |
Вопрос
Я новичок в использовании 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 видимого окна, но это все равно не сработало.
Спасибо за любую помощь!
Решение
Я думаю, работа с 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.