Вопрос

Я новичок в использовании 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top