2

レイヤード ウィンドウをスクレイピング (スクリーン ショットを撮る) しようとしていますが、正しく動作していないようです。一部の階層化されたウィンドウは正常に機能し、一部は機能しません。以下は私がこれをやっている方法です:

IntPtr display_dc = GetDC(IntPtr.Zero);
IntPtr bitmap_dc = CreateCompatibleDC(display_dc);
IntPtr bitmap = CreateCompatibleBitmap(display_dc, rect.Width, rect.Height);
IntPtr null_bitmap = SelectObject(bitmap_dc, bitmap);

IntPtr window_dc = GetWindowDC(Handle);
BitBlt(bitmap_dc, 0, 0, rect.Width, rect.Height, window_dc, 0, 0, 
    TernaryRasterOperations.SRCCOPY | TernaryRasterOperations.SRCPAINT);

ReleaseDC(Handle, window_dc);
SelectObject(bitmap_dc, null_bitmap);
DeleteDC(bitmap_dc);

using (Bitmap temp = Bitmap.FromHbitmap(bitmap))
{
     temp.Save(String.Format(@"C:\{0}_test.bmp", Handle.ToString("x")));
}

DeleteObject(bitmap);
ReleaseDC(IntPtr.Zero, display_dc);

問題は、SetLayeredWindowAttributes を介して作成されたウィンドウの正しい画像と、レイヤード ウィンドウが UpdateLayeredWindow を介して更新されたときに黒いビットマップを取得していることです。UpdateLayeredWindow win api 呼び出しを介して更新されたレイヤード ウィンドウをスクレイピングする方法があるかどうか誰か教えてもらえますか?

これまでの回避策は、画面全体のスクリーンショットを撮り、そこからウィンドウのビットマップをコピーすることです。問題は、これが正しく機能するためにウィンドウが常に一番上にある必要があることです。

ティア

4

0 に答える 0