문제

WPF와 GDI를 처음 사용하고 이미지를 표시하는 데 어려움이 있습니다. 나의 최종 목표는 노출과 같은 것을 구축하는 것입니다. 지금까지 나는 화면을 회색으로 만들고 모든 활성 HWND를 모으고 모든 창의 화면을 캡처합니다. 지금은 소스를 설정하려는 단일 이미지 요소가 있지만 아무것도 나타나지 않습니다.

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를 하드 코딩하려고 시도했지만 여전히 작동하지 않습니다.

도움을 주셔서 감사합니다!

도움이 되었습니까?

해결책

메모리 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);

나중에 Amort DC를 삭제하는 것을 잊지 마십시오.

DeleteDC(memdc);

그리고 BTW, 당신은 필요하지 않습니다 image1.BeginInit();.

또한 확인하려면 모든 창을 열거 할 필요가 없습니다. 사용 GetDesktopWindow 대신 user32.dll의 메소드.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top