2012-11-11 2 views
0

아래 코드와 같이 DesktopWindow를 처리하는 방법을 사용하여 특정 영역을 가져오고 싶습니다.fromHdc 메서드를 사용하여 비트 맵 이미지를 만들 수 있습니까?

[DllImport("user32.dll")] 
    static extern IntPtr GetDesktopWindow(); 

    [DllImport("user32.dll")] 
    static extern IntPtr GetDCEx(IntPtr hwnd, IntPtr hrgn, uint flags); 

    [DllImport("user32.dll")] 
    static extern IntPtr ReleaseDC(IntPtr hwnd, IntPtr hdc); 

    public void ScreenShot() 
    { 
     try 
     { 
      IntPtr hwnd = GetDesktopWindow(); 
      IntPtr hdc = GetDCEx(hwnd, IntPtr.Zero, 1027); 

      Point temp = new Point(40, 40); 
      Graphics g = Graphics.FromHdc(hdc); 
      Bitmap bitmap = new Bitmap(mPanel.Width, mPanel.Height, g); 

      g.CopyFromScreen(PointToScreen(temp) , PointToScreen(PictureBox.Location) , PictureBox.Size); 

}

이 코드는 실제로 작동,하지만 난 CopyFromScreen의 과정에서 이루어집니다 복사 된 이미지를 좀하고 싶습니다. 내가 Graphics.FromImage (비트 맵) 같은 코드를 사용하여 시도했지만, 내가 원하는 이미지를 얻을 수 없습니다 ... 내 말은, 복사 이미지. Graphics 객체 fromHdc를 사용할 때 비트 맵 이미지를 가져 오는 방법을 찾지 못했습니다. DC를 사용해야합니다 .... 적절한 방법이 있습니까 ??

답변

2

여기에서 잘못된 방향으로 가고 있습니다. 바탕 화면 핸들을 가져올 필요가 없습니다. CopyFromScreen은 화면의 모든 내용을 대상 그래픽에 복사하므로 이미지에서 그래픽 개체를 만들어야합니다. 다음 코드는 화면 왼쪽 상단에 500x500 이미지를 만듭니다. 당신이 정말로 HDC이있는 경우

public static void ScreenShot() 
{ 
    var destBitmap = new Bitmap(500, 500); 
    using (var destGraph = Graphics.FromImage(destBitmap)) 
    { 
     destGraph.CopyFromScreen(new Point(), new Point(), destBitmap.Size); 
    } 
    destBitmap.Save(@"c:\bla.png"); 
} 

은 당신이 GDI32에서 비트 블리트를 사용해야합니다 : 그것은 gratitute에 조금 늦게하지만 당신의 대답을

[DllImport("gdi32.dll")] 
public static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop); 
+0

덕분에 내 문제가 (임 게으른 ... becoz) 완전히 삭제되었습니다. –

+1

내 대답이 도움이 되었습니까? 아니면 다른 방식으로 해결 했습니까? (질문이 있으면 닫으십시오.) – Arthur

+0

(help vampires ...) – heltonbiker