2012-10-04 4 views
0

나는 사용자의 마우스 및 키보드 활동을 기록/직렬화 한 다음 C# + WPF로 재생할 수있는 간단한 프로그램을 작성하고 있습니다.화면 영역을 선택하는 가장 쉬운 방법

일부 기능을 사용하려면 화면에서 작은 영역의 좌표를 지정해야합니다. 왼쪽 위와 아래 오른쪽 모서리의 좌표를 텍스트 상자에 입력하는 것은 그리 편안하지 않으므로 Windows Snipping Tool, ZScreen/ShareX 등과 같이 비슷한 방법으로 선택하고 싶습니다. 그런

뭔가가, 어쩌면

그것을 구현하는 가장 쉬운 방법은 무엇입니까

을 단순화?

나는 많이 봤지만 많은 것을 찾지 못했습니다. 간단하고 명확합니다. http://cropper.codeplex.com/ 소스 코드가 너무 복잡해 보이고 이미지가 필요 없으며 화면에만 상대적으로 조정됩니다.

+0

이 정적 클래스를 시도 할 수 있습니다 : http://stackoverflow.com/questions/12770432/transparent-rectangle-inside-window – AlexP11223

답변

-1

당신은 내가 여기 해결책을 발견했습니다 CaptureScreenCapture method

static public class CaptureScreen 
{ 
    public static BitmapSource Capture(Rect area) 
    { 
     IntPtr screenDC = GetDC(IntPtr.Zero); 
     IntPtr memDC = CreateCompatibleDC(screenDC); 
     IntPtr hBitmap = CreateCompatibleBitmap(screenDC, (int)SystemParameters.VirtualScreenWidth, (int)SystemParameters.VirtualScreenHeight); 
     SelectObject(memDC, hBitmap); // Select bitmap from compatible bitmap to memDC 

     // TODO: BitBlt may fail horribly 
     BitBlt(memDC, 0, 0, (int)area.Width, (int)area.Height, screenDC, (int)area.X, (int)area.Y, TernaryRasterOperations.SRCCOPY); 
     BitmapSource bsource = Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); 

     DeleteObject(hBitmap); 
     ReleaseDC(IntPtr.Zero, screenDC); 
     ReleaseDC(IntPtr.Zero, memDC); 
     return bsource; 
    } 

    #region WINAPI DLL Imports 

    [DllImport("gdi32.dll", ExactSpelling = true, PreserveSig = true, SetLastError = true)] 
    static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj); 

    [DllImport("gdi32.dll")] 
    private static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight); 

    [DllImport("gdi32.dll", SetLastError = true)] 
    private static extern IntPtr CreateCompatibleDC(IntPtr hdc); 

    [DllImport("gdi32.dll")] 
    private static extern bool DeleteObject(IntPtr hObject); 

    [DllImport("gdi32.dll")] 
    private static extern IntPtr CreateBitmap(int nWidth, int nHeight, uint cPlanes, uint cBitsPerPel, IntPtr lpvBits); 

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

    [DllImport("user32.dll")] 
    private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); 

    private enum TernaryRasterOperations : uint 
    { 
     /// <summary>dest = source</summary> 
     SRCCOPY = 0x00CC0020, 
     /// <summary>dest = source OR dest</summary> 
     SRCPAINT = 0x00EE0086, 
     /// <summary>dest = source AND dest</summary> 
     SRCAND = 0x008800C6, 
     /// <summary>dest = source XOR dest</summary> 
     SRCINVERT = 0x00660046, 
     /// <summary>dest = source AND (NOT dest)</summary> 
     SRCERASE = 0x00440328, 
     /// <summary>dest = (NOT source)</summary> 
     NOTSRCCOPY = 0x00330008, 
     /// <summary>dest = (NOT src) AND (NOT dest)</summary> 
     NOTSRCERASE = 0x001100A6, 
     /// <summary>dest = (source AND pattern)</summary> 
     MERGECOPY = 0x00C000CA, 
     /// <summary>dest = (NOT source) OR dest</summary> 
     MERGEPAINT = 0x00BB0226, 
     /// <summary>dest = pattern</summary> 
     PATCOPY = 0x00F00021, 
     /// <summary>dest = DPSnoo</summary> 
     PATPAINT = 0x00FB0A09, 
     /// <summary>dest = pattern XOR dest</summary> 
     PATINVERT = 0x005A0049, 
     /// <summary>dest = (NOT dest)</summary> 
     DSTINVERT = 0x00550009, 
     /// <summary>dest = BLACK</summary> 
     BLACKNESS = 0x00000042, 
     /// <summary>dest = WHITE</summary> 
     WHITENESS = 0x00FF0062 
    } 

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

    #endregion 
} 
+0

나는 방법을 알고 화면 캡처. 하지만 사용자가 ZScreen/ShareX/Cropper/WinSnippingTool이나 위의 스크린 샷과 같은 선택 사각형을 사용하여이를 선택할 수있게하는 방법을 모르겠습니다. – AlexP11223

관련 문제