2009-11-15 6 views
2

WPF 및 GDI를 처음 사용하고 이미지 표시에 문제가 있습니다. 내 궁극적 인 목표는 노출과 같은 것을 구축하는 것입니다. 지금까지, 나는 화면을 회색으로 표시하고 모든 활성 HWND를 모으고 모든 창을 캡처했습니다. 지금은 원본을 설정하려고하는 단일 이미지 요소가 있지만 아무 것도 나타나지 않습니다.WPF 이미지가 BitmapSource를 표시하지 않습니다.

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

도움 주셔서 감사합니다.

답변

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

또한 확인하기 위해 모든 창을 열거 할 필요가 없습니다. user32.dll의 GetDesktopWindow 메서드를 대신 사용하십시오.

관련 문제