3

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をハードコーディングしようとしましたが、それでも機能しません。

助けてくれてありがとう!

4

1 に答える 1

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 のメソッドを使用してください。

于 2009-11-15T06:46:48.910 に答える