2014-12-08 1 views
3

최근에 활성 창의 스크린 샷을 만드는 코드를 발견했습니다. 실제로 작동하지만 이미지가 너무 크면 현재 창 경계를 벗어납니다. 테두리 외부의 활성 창의 스크린 샷

내 프로그램과 함께 찍은 스크린 샷입니다 : this is the screenshot taken with my program

이로 촬영 한 스크린 샷입니다 ALT + PRINTSCREEN : 난 그냥 원하는

public static class Screenshotter 
{ 
    [DllImport("user32.dll")] 
    static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); 

    [DllImport("user32.dll")] 
    private static extern bool PrintWindow(IntPtr hwnd, IntPtr hdcBlt, uint nFlags); 

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

    [StructLayout(LayoutKind.Sequential)] 
    public struct RECT 
    { 
     public int Left;  // x position of upper-left corner 
     public int Top;   // y position of upper-left corner 
     public int Right;  // x position of lower-right corner 
     public int Bottom;  // y position of lower-right corner 
    } 

    public static void MakeScreenshot() 
    { 
     var foregroundWindowsHandle = GetForegroundWindow(); 
     var rect = new RECT(); 

     GetWindowRect(foregroundWindowsHandle, out rect); 

     Rectangle bounds = new Rectangle(rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top); 

     Bitmap bmp = new Bitmap(bounds.Width, bounds.Height); 

     using (Graphics g = Graphics.FromImage(bmp)) 
     { 
      g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size); 
     } 

     bmp.Save("test.png", ImageFormat.Png); 
    } 
} 

: 이것은 내 수업이 This is the screenshot taken with alt+printscreen

입니다 활성 창을 스크린 샷으로 표시하고 창 밖에서는 그렇지 않습니다. 나는 누군가가 나를 도울 수 있기를 바랍니다 :)

+0

궁금한데, 'CursorPosition'의 목적은 무엇입니까? – tnw

+1

오, 와우, 아무 목적도 없다. 사실 나는 단지 그것을 볼 수있다. –

+0

창의 테두리 크기를 고려하십시오. http://msdn.microsoft.com/en-us/library/system.windows.forms.systeminformation(v=vs.110).aspx – Aybe

답변

0

설명했던 증상에 문제가 있습니다. 필자의 경우 윈도우가 시스템에 "전경"으로 등록 된 순간과 실제로 다른 윈도우의 앞에 화면에 완전히 표시된 시간 사이의 지연 때문에 발생했습니다. 당신은 아마 같은 것을 관찰 할 것입니다. g.CopyFromScreen(...)을 수행하면 화면의 영역에서 이전 포 그라운드 창에서 현재 상태로 계속 전환 될 수있는 픽셀을 가져옵니다. 첫 번째 저장된 이미지에서
, 당신은 내 이미지 캡처 프로그램 시작 후 150 밀리 초 단위로 만든 전경 창 (명령 프롬프트)의 스크린 샷을 볼 수

당신이 볼 수 있듯이

Screenshot of "foreground" window in with 150 milliseconds delay

, 그것은 혼합물이다 이전 전경 창의 픽셀 (Visual Studio) 및 새 픽셀

그것은 완전히 화면을 업데이트 할 또 다른 150 밀리에 나섭니다 : Screenshot of fully updated foreground window (300 ms delay)

그래서, 그것은 당신의 스크린 샷은 아닌 잘못된 크기를 가지고 - 그것은 새로운 전경 창은 최종 경계하지 "비정상적"아직입니다. 간단하고 (못생긴) 해결책은 을 넣고 g.CopyFromScreen(...) 전화를 걸어 화면의 픽셀을 완전히 교체 할 수있는 충분한 시간을줍니다.