Domanda

Sono nuovo di utilizzare WPF e GDI, e sto avendo problemi con la visualizzazione di un'immagine. Il mio obiettivo finale è quello di costruire qualcosa di esporre-like. Finora, ho gray-out gli schermi, raccogliere tutte le HWNDs attivi, e catturare le schermate di tutte le finestre. Per ora, ho un singolo elemento di immagine che cerco di impostare la fonte per, ma niente rivela mai in su.

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

Il codice completo è qui:
http://pastebin.com/m70af590 - codice
http://pastebin.com/m38966750 - XAML

So che il modo che ho ora non ha molto senso per quello che sto cercando di fare (in esecuzione il ciclo e solo scrivere alla stessa immagine più e più volte), ma spero di avere qualcosa su che immagine per la fine.

Ho provato duramente codifica l'HWND di una finestra visibile, e ancora non funziona.

Grazie per qualsiasi aiuto!

È stato utile?

Soluzione

Credo che lavorare con un DC di memoria risolverà il vostro problema. Per fare questo, prima importazione:

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

E invece di questo:

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

Fare questo:

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

Non dimenticate di eliminare il DC Memort seguito:

DeleteDC(memdc);

E BTW, non è necessario image1.BeginInit();.

Inoltre per controllare, non è necessario enumerare tutte le finestre. Utilizzare il metodo GetDesktopWindow da user32.dll, invece.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top