본문 바로가기
프로그래밍/delphi

delphi 선택한 모니터의 화면을 실시간으로 보여주는 프로그램..

by 메르세데쓰 2015. 12. 24.
반응형



안녕하세요 메르세데스입니다.   


얼마전 저희사이트에 고민이 있었습니다.  생각하기에 따라서 별 것 아닐 수도있지만..   문제는 이것입니다.


요즘 듀얼모니터를 사용하시는 분들이 정말 많죠..  저도 여러창을 띄워놓고 작업하는 일이 많다보니 한 화면으로는 도저히 일을 못할지경이지요..   


근데 문제는 모니터가 멀리 떨어져 있는 경우입니다.  


예를든다면..고객응대용으로 만들어진 2번째 모니터가 뒤로 돌아져 있거나 저 멀리 떨어져 있습니다.


이런경우 2번째 화면에 정말 의도한 내용이 잘 표시가 되는지..궁금하겠죠. 또한 화면이 안보이니..실수로 카톡과 같은 사생활적인 내용의 팝업이 띄워져 있다면 좀 난감할 수 있습니다.


무엇보다 저희 사이트에서 가장 문제는 얼마전 도입한 프로그램이 기본설정이 2번째 화면에 표시가 된다는 것입니다.  창을 한번 옮겨놓으면 기억을해서 다시는 그 쪽으로 안뜬다고 하는데 모든 컴퓨터에서 그렇지는 않은 것 같습니다.


이것 때문에 매일 전화에 시달리고 있습니다. 


잘 안보이는 창을 옮길 수만 있다면 좀 수월할텐데~~ 이렇게 고민이 시작되었습니다.


예전에 델파이로 캡쳐하는 프로그램에 대해 포스팅을 한 적이 있었죠.. 여기서 힌트를 좀 얻어서 ...


사실 실시간 이라는 게 초당 30프레임정도로 정지화면을 연속으로 보여주는 것이죠.  타이머의 빈도수를 조절하고.. 스크린캡쳐함수를 이용하여 만들어진 결과물을  TImage컴포넌트와 같은 것으로 받아 처리한다면.. 그리 어렵지 않을 거라 생각합니다.


아래처럼.. 구성해봤고요..   모니터를 선택 할 수 있도록 라디오버튼을 만들었습니다.


프로그램의 화면디자인...


화면 중앙부분엔 이미지파일을 받을 수 있도록 컴포넌트를 올려놨습니다.



아래는 ScreenCapture함수를 만들어봤습니다.   


Screen.Monitors[] 를 통해서  선택한 모니터의 사이즈,픽셀좌표 를 구해서..   BitBlt  (windows.pas)에 있는 함수를 이용해서 비트맵파일을 만들어서 반환하는 것입니다. 


델파이로만든 화면캡쳐함수..



물론 방법에 따라.. BMP파일 또는 JPG이미지 파일로 결과물을 만들어 처리할 수 있지만.. 타이머의 interval을 초당20~30프레임으로 설정하면.. 상대적으로 느린 하드디스크 때문에 문제가 발생 할 것입니다.


저는 그래서  MemoryStream으로 처리했습니다. 결과물을 메모리에 임시 상주시켜..  AdvPicture컴포넌트로 결과물을 뿌려줍니다. 물론..  아래에 주석처리를 해 놓은 것을 보시면..  TImage를 이용하셔도 됩니다.  


이곳에서 처리할 때  중요한 것은 메모리 누수가 안생기도록 처리해 주는 것입니다.  TMS에 들어있는 AdvPicture컴포넌트는 확인해보니 별도의 해제 처리를 안해도 알아서 잘되네요    


하지만 TImage를 쓰실때는 ..   Image.picture := nil 혹은 Image.picture.Assign(nil) 처럼 담기전 사전 처리를 해주셔야 오류가 나지 않습니다.


둘의 차이는.. 성능과 원하는 옵션???   성능은 이미지컴포넌트가 잘나옵니다. 훨씬빠르고 리소스도 적게먹습니다.


이미지를 메모리스트림방식으로 읽어드림


중요한 소스는 위에 2개이니.. 조금만 보실줄 아시면 저보다 훌륭한 프로그램 만드실 겁니다.  저도 내공이 없어서 군데군데 허술한 코딩이 보이네요;


결과물은 아래와 같습니다. 왼쪽에 실시간프로그램을 실행시켜놓고.. 오른쪽화면을 초당 몇프레임씩 읽어와서 뿌려주는것입니다.


실시간 화면프로그램 수행결과



이걸 당장 적용하기엔 좀 그렇고.. 살펴보니   몇가지 문제만 보완한다면  그럭저럭 사용은 할만 하겠습니다.


일단 screencapture의  문제는.. 마우스포인터가 안 보인다는 것입니다.  원하는 화면이 보이긴 하지만.. 중요한 커서가 안보여 마우스로 창을 옮기질 못하겠군요..  



포스팅을 하는 지금 시점에선 이 문제를 해결하긴 했습니다.. 


소스에도 흔적이 남아있네요; DrawCursorImage(vBmp); 이렇게 함수가..  이번시간엔 이걸로 마무리를 하겠습니다.


다음시간에 해결 방법을 진행해 보겠습니다.  혹시 비슷한 고민을 하시는 분들께 도움이 되셨기를 바랄 뿐입니다.


감사합니다.




반응형

댓글