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
'C - C++ - C# - Form - WPF' 카테고리의 다른 글
C# WPF 콤보박스 ENUM을 데이터 바인딩하여 사용하기 (0) | 2019.03.08 |
---|---|
C# WPF 마우스 이벤트 발생시키기 mouse event fire / raise (0) | 2019.03.07 |
[C# 윈폼] 단축키 핫키 Hot Key 지정과 윈도우 전역 핫키 단축키 지정 (8) | 2018.06.28 |
C# 윈도우폼 WinForm 에서 Access DB 사용 시 주의할 점 / 저장 안됨 / 수정 안됨 / 재실행 시 저장 값 안보임 (0) | 2018.03.29 |
포인터 이해하기 (0) | 2013.01.14 |
WRITTEN BY