출처: http://yjngh.tistory.com/entry/%EB%B9%84%ED%99%9C%EC%84%B1-%EC%B0%BD-%EB%A7%A4%ED%81%AC%EB%A1%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0
비활성창 매크로 제작기..
조조전 재료의 압박때문에..짜증이 나던터에.. 오토를 만들었다..
opencv개발을 해왔던 터라 주로 활성창을 캡쳐해서 하는 방법으로 주로 했었는데
활성창의 경우 집에서는 와이프 눈치 보느라..
회사에서는 활성창으로는 도저히 녹스를 돌리기 힘들었다.
게다가 내가 캡쳐를 하는방식은 화면을 스크린샷 하는것이기 때문에 화면을 아래로 숨기게 되면
이런식으로 보이는화면 밖으로 나간부분은 캡쳐가 되지않는다.
그러던중 비활성창 캡쳐에 관련된 글을 보았다.
public static Bitmap PrintWindow(IntPtr hwnd)
{
DateTime starttime = DateTime.Now;
Rectangle rc = Rectangle.Empty;
Graphics gfxWin = Graphics.FromHwnd(hwnd);
rc = Rectangle.Round(gfxWin.VisibleClipBounds);
Bitmap bmp = new Bitmap(
rc.Width, rc.Height,
System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Graphics gfxBmp = Graphics.FromImage(bmp);
IntPtr hdcBitmap = gfxBmp.GetHdc();
bool succeeded = PrintWindow(hwnd, hdcBitmap, testnum);
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();
Console.WriteLine((DateTime.Now - starttime).TotalMilliseconds);
//bmp.Save("test.jpg");
return bmp;
}
출처: http://lesomnus.tistory.com/10#footnote_link_10_1 [Dev. Somnus]
약간의 수정을 거쳐 테스트 해보았다.
잘동작하도록 만든후
기존의 Click함수를 PostMessage로 변경하고(Click 함수는 그 창이 맨앞으로 나와있어야 하기때문에 활성창이 아니면 사용 불가능하다)
이전에 쓰던 findtemplate 함수를 이용하여 이미지 서칭의 Source화면 파일로 집어넣고 돌리니 잘동작한다.
덧글
'언어 > C#' 카테고리의 다른 글
미로그리기 소스 (0) | 2018.03.10 |
---|---|
C#에서 ImageSearch 사용하기 (0) | 2018.03.10 |
ZylSerialPort.NET define (0) | 2018.02.19 |
ini파일 다루기 (0) | 2018.02.19 |
directory관련 (0) | 2018.02.19 |