화면 감시 프로그램 – 힌트 요청…

블로그에 질문을 올리는 것도 가능하다. (응?)

나는 다음과 같은 코드를 작성하였다.

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim bounds As Rectangle

Dim screenshot, backup As System.Drawing.Bitmap

Dim graph As Graphics

Dim x, y, z, w As Integer

x = 0

bounds = Screen.PrimaryScreen.Bounds

screenshot = New System.Drawing.Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)

backup = New System.Drawing.Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)

graph = Graphics.FromImage(screenshot)

graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)

Do While True

backup = screenshot

graph = Graphics.FromImage(screenshot)

graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)

Dim i, j As Integer

For i = 1 To 10

For j = 1 To 10

y = System.Math.Abs(CInt(backup.GetPixel(i, j).R – screenshot.GetPixel(i, j).R Mod 256))

z = System.Math.Abs(CInt(backup.GetPixel(i, j).G – screenshot.GetPixel(i, j).G Mod 256))

w = System.Math.Abs(CInt(backup.GetPixel(i, j).B – screenshot.GetPixel(i, j).B Mod 256))

x = x + y + z + w

Next

Next

If Not (x = 0) Then

MsgBox(x)

Exit Do

End If

Loop

End Sub

End Class

앞발로 짠 코드이므로 가독성이나 그런건 전혀 신경 안쓰고 막 두들겼다.

이 코드가 하는 일은 다음과 같다.

1. 모니터 화면의 특정 영역을 감시한다. (이 예제 코드에서는 0,0에서 10,10까지의 왼쪽 상단 모서리)

2. 특정 영역에 변화가 생기면

3. 알림 팝업을 띄운다.

이걸 왜 만드는가…

그것은, 월급 400만원 받는 사람이 모니터를 뚫어지게 바라보고 있다가 특정 영역에 변화가 생기면 마우스를 클릭하는, 그런 일을 하고 있기 때문이다. 그 사람에게 다른 일을 시키기 위해서 이 부분을 자동화 시켜야 한다.

물론…이 프로그램을 만든다고 해서 절약된 돈 400만원의 일부가 나에게 성과급으로 돌아올 것인가…그건 전혀 기대할 수 없다.

아무튼.

요점은, 위의 코드를 실행하는 Form1에는 버튼이 하나 있고, 그 버튼을 클릭하면 저 프로그램의 코드가 작동을 시작하도록 되어 있다.

문제는 저 코드를 실행시키면 예상대로 무한루프에는 빠져 들어가는데, 화면이 변해도 감지를 못한다는 점이다. 무한루프 자체에 너무 빠져버린 듯…

그래서 – 화면을 감시하는 프로그램은 대체 알고리즘이 어떻게 되어 있는 걸까?

일단은 그런 알고리즘을 찾는다는 핑계로 인터넷 서핑을 하고 있었다. 정신을 차려보니 네이버 뉴스와 올블로그를 돌아다니는 나를 발견, 급히 이 글을 작성해 둔다.

6 thoughts on “화면 감시 프로그램 – 힌트 요청…

Add yours

  1. 안녕하세요?
    저는 코드를 볼줄 모릅니다만, 글쓰신님과 비슷한 이유로 그와 같은 기능을 가진 프로그램을 찾고 있었습니다.
    앞에 분과 마찬가지로 구글에서 ‘화면 변화 감시’로 검색해서 이곳까지 오게 되었습니다.
    프로그램은 잘 되었는지 궁금합니다.
    한 가지, 아이디어라면 아이디어라 할 수 잇을테고, 아니면 아니라고 할 수 있을테고…
    1. 일정 시간마다 “타이머 이벤트”를 발생시킨다
    2. 타이머 이벤트가 발생할 때, 기존의 비트맵을 백업하고 새 비트맵을 캡쳐한다
    3. 두 비트맵 사이의 차이를 확인한다.
    이렇게 구현 하려고 하셨는데,
    구현하는데 어려움이 많을 듯 합니다.
    특히, 동영상이라면 거의 다르게 나올테고….
    여기에 2번의 “타이머 이벤트가 발생할 때, 기존의 비트맵을 백업하고 새 비트맵을 캡쳐한다.”는 부분을
    앞 캡쳐 화면과 뒤 캡쳐 화면의 차이를 명확하게 하기 위해 흑백으로 전환하고,
    이 화면을 9*9 혹은 16*16을 한 픽셀이 되도록 합치고(이 크기는 유저 설정으로 선택 할 수 있으면 좋을 듯…),
    이 픽셀들을 비교해서 상이한 픽셀의 수를 구하고,
    이 픽셀의 수와 전체 비교 픽셀의 비율(유저 설정)로 화면의 변화를 검출하도록 한다.
    이렇게 하면 구현이 될 것 같기도 합니다만….

    결국, 화소들의 명암의 차이만 비교한다고 할까요?
    화면의 명암의 차이를 검출할때에도 픽셀의 명암 등급을 너무 세밀하게 하면 모두 다르게 나올테니,
    그 명암을 단순화 하는것도 여러번 테스트 해 봐야 결론이 나올 듯….

  2. 오토핫키라는 프로그램에서 화면 감시도 가능하다고 들었습니다.

    실질적으로는 이 기능을 5월 중에 구현해볼 예정이라 아직은 전혀 손대고 있지 않고요.

    만약 구현하게 된다면 연락 드리겠습니다.

  3. 안녕하세요?

    저는 코드를 전혀 볼줄 모릅니다만… 글쓰신님과 비슷한 이유로 그와같은 기능을가진프로그램을 찾고 있었습니다.. 구글에서 ‘화면 변화 감시’로 검색해서 이곳까지 오게 되었네요..

    화면의 일부영역(아주 작은 채팅 텍스트라인입니다. ) 을 사용자가 지정하고 그 영역내에 변화가 발생했을때 팝업창이 아닌 소리로 알려주는(또는 사용자지정 wav 재생) 기능을하는 프로그램을 찾고 있습니다..

    혹시 그와같은 프로그램을 만드시거나 찾으셨다면 그 정보를 얻고 싶습니다.

    전혀 도움을 드리지 못하고 부탁의 글을 올리고 가네요.

    제게 도움이 될만한 정보가 있으시면 메일좀 부탁드리겠습니다

    sunnitek45@hotmail.com

  4. 음…좋은 의견 감사합니다. 제시한 방법을 제 목적에 맞도록 개조하면 다음과 같이 되겠군요

    1. 일정 시간마다 “타이머 이벤트”를 발생시킨다

    2. 타이머 이벤트가 발생할 때, 기존의 비트맵을 백업하고 새 비트맵을 캡쳐한다

    3. 두 비트맵 사이의 차이를 확인한다.

    4. 차이가 발생하면 내가 원하는 함수로 고고씽

    내일 구현해보고 결과를 말씀드리겠습니다.

    감사합니다.^^

  5. 비주얼베이직은 잘 몰라 코드를 자세히 읽어보지는 않았습니다. 색의 변화를 감지하는 것 같다는 정도만 독해 했습니다.;; 그리고 어떤식으로 화면이 변화할 지도 모르겠지만, 뭔가 무늬라던가 복잡도가 변화한다고 가정하고 아이디어를 하나 제시해 보겟습니다.

    [이하 방법]

    원하는 부분을 일정 시간마다(예를들면 1초 혹은 5초) 스크린샷한후 저장합니다. 저장할 때는 흑과 백으로만 색을 변환시켜 저장하면 좋겠습니다.(예를 들자면 단색비트맵이 있겠습니다.) 그리고 이미지는 5개 정도만 저장해 놓습니다. 시간이 경과해 필요없어진 이미지는 폐기 시킵니다. 아니면 정상상태 이미지 한개를 저장해 놓을 수도 있겠습니다.

    그 부분에 어떤 변화가 생긴다면 이미지의 용량이 달라질 것입니다. 이렇게 달라진 스샷이미지의 용량변화를 감지하게 하면 어떨까요?

    구지 흑백으로 이미지를 저장할 필요는 없다고 생각하지만, 쓸데없이 허비되는 용량을 크게 할 필요가 없다고 생각했습니다. 변환과저에서 걸리는 시간이 너무 길어진다면, 그냥 곧바로 저장하므로써 불필요한 작업을 줄일수도 있겠습니다.

    프로그램을 만드는것이 가능할지, 가능하더라도 쉬울지는 모르겠지만.. 글을 읽고 떠오른 것을 몇자 적어봤습니다.ㅎ

댓글 남기기

이메일은 공개되지 않습니다.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Proudly powered by WordPress | Theme: Baskerville 2 by Anders Noren.

Up ↑

%d 블로거가 이것을 좋아합니다: