Frage

Ich bin neu mit WPF und GDI, und ich habe Probleme, ein Bild angezeigt wird. Mein Fernziel ist es, bauen etwas aussetzen artig. Bisher habe ich grau-out den Bildschirmen versammeln sich alle aktiven HWNDs und erfassen die Bildschirme aller Fenster. Denn jetzt habe ich ein einzelnes Bild Element, dass ich versuche, die Quelle zu setzen, aber nichts erscheint.

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();
}

Der vollständige Code ist hier:
http://pastebin.com/m70af590 - Code
http://pastebin.com/m38966750 - XAML

ich weiß, wie ich es habe jetzt nicht viel Sinn macht für das, was ich versuche, (läuft die Schleife und das Schreiben nur auf das gleiche Bild immer und immer wieder) zu tun, aber ich bin die Hoffnung, etwas zu haben, auf dass Bild bis zum Ende.

Ich habe hart versucht, die Codierung der HWND eines sichtbaren Fenster, und es immer noch nicht funktionieren.

Vielen Dank für jede Hilfe!

War es hilfreich?

Lösung

Ich denke, die Arbeit mit einem Speicher DC wird Ihr Problem lösen. Um dies zu tun, ersten Import:

[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);

Und statt dies:

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

Tun Sie dies:

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);

Vergessen Sie nicht, später den Memort DC zu löschen:

DeleteDC(memdc);

Und BTW, die Sie nicht brauchen image1.BeginInit();.

Auch zu überprüfen, Sie nicht alle Fenster aufzuzählen brauchen. Verwenden GetDesktopWindow Methode von user32.dll statt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top