반응형

1. 프로세스 가져오기

- 헤더

 [DllImport("user32.dll")]

        public static extern int FindWindow(string lpClassName, string lpWindowName);


- 소스

public IntPtr Client_Connection(string clientname)

        {

            IntPtr iResulthwnd = new IntPtr();


            int inthwnd = FindWindow(null, clientname);

            if (inthwnd == 0)

            {

                iResulthwnd = new IntPtr(inthwnd);

            }

            else

            {

                iResulthwnd = new IntPtr(inthwnd);

            }

            return iResulthwnd;

        }





2. 프로그램 캡쳐

- 헤더

        [DllImport("user32.dll", SetLastError = true)]

        [return: MarshalAs(UnmanagedType.Bool)]

        static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);


        [DllImport("user32.dll", SetLastError = true)]

        static extern int GetWindowRgn(IntPtr hWnd, IntPtr hRgn);


        [DllImport("gdi32.dll")]

        static extern IntPtr CreateRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);


- 소스

public static void btnClick(object sender, EventArgs e){

     IntPtr Clienthwnd = Client_Connection(listViewProccess.SelectedItems[0].Text);

     if (Clienthwnd.Equals(0))

     {

         MessageBox.Show("클라이언트 검색 실패");

          return;

     }


     PrintWindow(Clienthwnd);

}


public static void PrintWindow(IntPtr hwnd)

        {

            Rectangle rc = Rectangle.Empty;

            Graphics gfxWin = Graphics.FromHwnd(hwnd);

            rc = Rectangle.Round(gfxWin.VisibleClipBounds);


            Bitmap bmp = new Bitmap(rc.Width, rc.Height, PixelFormat.Format32bppArgb);


            Graphics gfxBmp = Graphics.FromImage(bmp);

            IntPtr hdcBitmap = gfxBmp.GetHdc();

            bool succeeded = PrintWindow(hwnd, hdcBitmap, 1);

            gfxBmp.ReleaseHdc(hdcBitmap);

            if (!succeeded)

            {

                gfxBmp.FillRectangle(

                    new SolidBrush(Color.Gray),

                    new Rectangle(Point.Empty, bmp.Size));

            }

            IntPtr hRgn = CreateRectRgn(0, 0, 0, 0);

            GetWindowRgn(hwnd, hRgn);

            Region region = Region.FromHrgn(hRgn);

            if (!region.IsEmpty(gfxBmp))

            {

                gfxBmp.ExcludeClip(region);

                gfxBmp.Clear(Color.Transparent);

            }

            gfxBmp.Dispose();

            bmp.Save(Application.StartupPath + "//images//" + System.DateTime.Now.ToString("yyyy년MM월dd일 hh시 mm분 ss초") + ".bmp", System.Drawing.Imaging.ImageFormat.Bmp);

        }




3. 주의점

- 프로세스명은 불러온 그대로 찾아야합니다. 

  저 같은 경우, 임의로 프로세스명을 바꾸어서(Replace해서 특정 문자열을 삭제했었습니다) 

  리스트에 뿌린다음에 리스트에서 선택한 프로세스 제목을 캡쳐하는 식으로 

  프로그램을 짰었는데 계속 검은 화면이나 회색화면으로 캡쳐가 되더군요 ㅡㅡ;;;


  알고보니 프로세스명을 잘못 가져와서...


  팟플레이어 캡쳐 / 비활성화 된 프로그램도 캡쳐 잘 되는거 확인했습니다.

  검색해서 여기저기 보니까 게임도 캡쳐가 가능하다고 하더군요.

  PrintWindow "1" 이 옵션에 따라 캡쳐 조건도 다른거 같습니다.



# 참고사이트

프로그램 캡쳐 : http://lesomnus.tistory.com/10#footnote_link_10_1

프로세스 가져오기 : http://infodbbase.tistory.com/91

반응형

WRITTEN BY
데르벨준

,