Microsoft MVP성태의 닷넷 이야기
Screen Capture 와.. Overlay 질문 좀 드릴게요 ㅠ.ㅠ ( 장문 주의..... ) [링크 복사], [링크+제목 복사],
조회: 9683
글쓴 사람
최선호 donator
홈페이지
첨부 파일
 

익명으로.. 글 적었었는데...

로그인은 처음이네요...

일단 항상 도움 주셔서 감사드립니다...




다름이 아니라... 현재 원격으로 스트리밍 제어 하는 프로젝트를 진행 하고 있습니다....

그런데 클라이언트 측에서 원격으로 제어 하는 도중에는 원격지의 모니터 화면을 안보이게 처리 해달라고 요구가 들어왔어요....

다른 점은 좀 안정화 되어 가는데... 이 부분에서.. 현재 일주일 넘게 막혀있습니다 ㅠ.ㅠ

한가하실때... 좋은 방안 있는지 생각 한번 부탁드릴게요...
(처음부터 사수 없이 코드만 받고 입문해서... 성태님 도움 항상 감사합니다... // 성태님 같으신 사수 한분 계시면.. 몸이 부셔지도록 열심히 할 자신 있는데요.......ㅠ.ㅠ)






일단 저는 현재 총 6가지 방법으로 시도 해봤습니다..!!


방법1. Ultra vnc 의 Blank Screen 기능 구현

       - 구현 방법

            1. Sendmessage 로 Monitor 절전 모드로 진입 시킨 후 ( 1.3초 주기 )
            2. Mouseevent 델타좌표 0,0 ( 제자리 ) 이벤트로 절전 모드 해제
            

            void Black_Proc()
            {
                    while (isRun)
                    {
                        if (mouse_cnt >= 13)
                        {
                            SendMessage(frm.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)MonitorState.OFF);
                            mouse_cnt = 0;
                        }

                        mouse_event(MOUSEEVENTF_MOVE, 0, 0, 0, UIntPtr.Zero);
                        mouse_cnt++;

                        ScreenCapture_Proc();

                        Thread.Sleep(100);
                    }
            }
            
       - 결과 :
             1. DeskTop PC만 적용 가능 (노트북 / 태블릿 / 기타 적용 불가 / 특정 모니터 브랜드 및 기종의 경우 오작동 현상 발견 (Winlogon으로 넘어감...) )
             2. 절전 모드 진입 후 해제 하는 동안 Frame이 Drop 됨... (Cpu Load도 증가...)



방법2. TopMost & Black Backcolor Form 사용
       
       - 구현 방법

            1. Black Form의 Opacity = 0 설정 후 ( visible TransparencyKey Opacity 중 압도적으로 빠름... )
            2. ScreenCapture_Proc(); 호출하여 화면을 저장하고
            3. Black Form의 Opacity = 100 복구

            void Black_Proc()
            {
                    while (isRun)
                    {

                        blankFrm.Opacity = 0;
                        ScreenCapture_Proc();
                        blankFrm.Opacity = 100;

                        Thread.Sleep(100);
                    }
            }

       - 결과
            1. 캡처 시간동안 Black Form 사라지게 되어 보안 효과가 상실 됨...
               10ms (캡쳐 시간 ) * 30fps = 300ms (1초당 300ms 노출....)


방법3. DDC-CI Protocol 을 이용한 PNP Monitor (po전원wer) 제어..

       - 구현 방법
            1. DDC - CI 프로토콜이 지원 되는지 확인 해본다....
            2. 지원 되는 경우 전원을 끈다....

       - 결과
            1. DDC - CI 프로토콜이 지원 되는 경우 아주 아름답고 완벽한 구동이 이루어집니다....
            2. 하지만. (노트북 / DDC-CI 미지원 / 태블릿 불가...) 등의 문제가 있습니다 ㅠ.ㅠ



방법4. DDC-CI Protocol 을 이용한 PNP Monitor (모드 전환) 제어..

       - 구현 방법
            방법3. 과 비슷한 절차로 진행 모드 전환 버튼을 제어한다.
            (특정 모니터 중 전원 제어가 안되는 경우 Monitor의 VGA / DVI / HDMI 전환 감지 버튼을 1초 마다 눌러줘... 화면 표시를 불가 하게 함...)


       - 결과 : 방법3과 동일.....


방법5. DDC-CI Protocol 을 이용한 PNP Monitor (밝기) 제어..

       - 구현 방법
            방법3. 과 비슷 한 절차로 진행. 밝기를 제어 한다.
      
       - 결과
            태블릿 / 노트북을 포함한 엄청나게 많은 장치가 DDC-CI 밝기 제어는 지원한다.....
            하지만.. 잘 안보일뿐... 신경써서 보면 보인다 ㅠ.ㅠ


방법6. Mouse 커서를 이용한 편법...
       
       - 구현 방법
             Bitblt 호출 시 Mousecursor 가 캡쳐 되지 않는 점을 이용하여...
             원격지 마우스 커서를 화면에 가득 찰 만큼... Black 색상의.. 엄청나게 큰 커서로 교체 하여... 원격지 화면은 마우스 커서 천지로 도배 하고...
             제어 피시에는 마우스 커서가 제외되어 정상적인 화면이 출력.

       - 결과
             모니터 드라이브가 PNP 모니터인 경우 불가 하고, 별도의 모니터 드라이브를 설치 해야함.
             설치된 모니터 드라이브에서 Hardware Mouse cursor를 지원 하지 않는 경우
             방법2. 의 결과와 증상이 동일.. ( 눈뽕 공격 당해요 ㅠ.ㅠ )


성태님 엄청나게 긴 글이라는거 알고 있지만...

그냥 가벼운 마음으로 한번 슥 읽어 주시고...

제가 방향 잡을 수 있도록 키워드라도 주시면 감사합니다 ^_^




현재 구상 중인 것은....
( 윈도우 10 에 "Win + G" 키를 누르면.. 게임 캡쳐 도구가 출력 되는데.. 그 녀석은 DXGI에도... Bitblt에도... 캡쳐되지 않는데... )
( 하지만 왠지 구현을 하면.. 입력 장치를 "게임 캡쳐 도구"가 가져가게 되어... 제어는 불가 할 것 같습니다.............)
( 캡쳐는 되면서 모니터에는 출력되는 Hardware Direct Render 방법은 없을까요 +_+? )


이제 주말이 시작되는데... 혹시 성태님 번쩍이는 생각이나.. 조언 해주실 부분 있으면 댓글 부탁드립니다.!!!

긴글 읽어주셔서 감사하고, 좋은 주말 보내시고...

혹시나 위에 명시된 방법 중에 테스트 해보고 싶으신 거 있으시면, 제가 재현 코드 정리 해서 보내드릴꼐요 +ㅁ+


지금은... 고된 테스트와 엄청난 복사 / 붙여넣기가 난무 하여... 테스트 코드가 전쟁이 난 상태입니다..............

혹시 검토 해보고 싶으신 코드 있으시면 이쁘게 정리 해서 첨부 하겠습니다...


항상 감사합니다 성태님 ~!~! +ㅁ+









[최초 등록일: ]
[최종 수정일: 10/18/2019]


비밀번호

댓글 작성자
 



2019-10-18 10시29분
^^; 구현 시나리오에서 피냄새(?)가 나는군요. DDC-CI같은 거나 Mouse 커서를 이용하는 등의 기발한 ^^ 생각을 하셨다는 것에 박수를 보내드립니다.

그런데, 사실 이런 류의 - 즉, 운영체제가 공식적으로 지원하지 않는 기능들은 표준적인 방법이 없으므로 그런 편법들을 최대한 어색하지 않게 구현할 수 밖에 없고, 그렇다 해도 그게 잘 동작한다는 보장을 할 수가 없습니다. 일단은 가장 자연스러운 방법이라고 생각되는 것들을 나열하시고 하나씩 클라이언트 측의 PC에서 지원하는지 확인 후 안 되면 다음 방법을 이어서 적용하는 것이 최선으로 보입니다.

게다가 필요하다면 현실적인 타협도 해야 합니다. 가령 태블릿이나 노트북이라면 아예 원격 제어를 지원하지 않는다는 식으로 명시를 하는 등의 제약을 두는 것입니다. 제품을 만들다 보면 그런 식의 제약을 두는 것도 한편으로는 꽤나 현실적인 방법일 수 있습니다.

어찌되었든 고생스러운 작업이군요. 뭐라고 도움이 될만한 내용을 써드리고 싶은데 저도 관련해서 딱히 아는 바가 없습니다. 그저 "화이팅~~~"이라고 응원하는 수밖에는 달리 도리가 없군요. ^^;
정성태
2019-10-18 11시22분
답변 달아주셔서 감사합니다 !!

기다리는 동안 creatdesktop 으로
가상데스크톱 만들어서.... switchdesktop 으로 넘겨서...

HVNC 방식으로 테스트 중인데....

ZORDER 역순으로... 핸들별로.. 렌더링 하니까..

다른 데스크톱 화면까지는 가져왔는데...

Postmessage로 이걸또 제어 하려니... 재앙의 시작입니다 ㅜ ㅜ

확실히 된다는 보장도 없구요 ㅜ ㅡ ㅜ

일단 오늘은 좀 쉬구 내일 다시 도전 해야겠습니다 +.+

좋은 주말 보내세요 ^^ 감사합니다!!
최선호

... 61  62  [63]  64  65  66  67  68  69  70  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
1042이성환2/20/201212916BlockingMethod에 빠진 스레드를 즉시 죽이고 싶습니다...;ㅅ; [2]파일 다운로드1
1039김재영2/15/201212119어셈블리에 사용자마다 다른 값을 적용하여 자동 빌드 방법이 있을까요? [2]
1037윈드로니2/12/201213588WPF 관련 질문 드립니다. [2]
1035임동찬2/9/201211920XML, XSD, XMLCodeGenerator 관련 [2]
1033곽성현2/7/201212285훔..윈도우 디바이스 드라이버 관련 [1]
1030궁빈2/2/201214765msbuild를 이용한 웹게시 및 자동 Dist 방법론에 대해 질문 드립니다!! [6]
1028신정환1/30/201212095기존 legacy Windows application이 WoA 환경에서 동작되지 않는 이유가 무얼까요? [2]
1026노현철1/19/201213882WPF가 XP에서 느리게 로딩되는 현상에 대해 질문드립니다. [4]
1025궁그미1/18/201214776네이버 소켓 로그인 이해가 안되는점이 있는데요 [2]
1022선무당1/11/201212977TFS 에서 공통 Assembly 공유 방법에 대해서 해결책이 없을까요? [2]
1021김재영1/8/201212025대리자를 메소드 파라메터로 넘겨도 됩니까? [2]파일 다운로드1
1019남산골11/13/201914264안녕하세요!! 성태님~~ [3]
1018강한구12/29/201117504WPF ClickOnce 배포시 콤포넌트 dll 다운로드 문제에 대하여 질문 있습니다. [1]
1017임동찬12/28/201114704smart client와 xbop, silverlight [6]
1015개똥이12/22/201112381RMCLOCK 설정 관련 질문이요ㅜ [2]
1011사길수12/16/201112379hyper-v 이더넷 카드 관련 문의 좀 드립니다. [1]
1006루로니12/13/201114540윈도우7과 XP의 DLL후킹 처리에 관해서 질문입니다. [3]
1005남산골12/13/201114307안녕하세요!! 첫 인사드립니다. [3]
1004뽀로로12/12/201111582Managed 어셈블리에서의 COM EntryPoint procaddress 문제 [1]
1003나그네12/8/201113605닷넷에서 가상메모리(Commit) 의 크기를 줄이거나 해제하는 방법은 어떻게 해야할지요? [1]
1002나그네11/29/201113294안녕하세요 ^^ 문제가 생겨서 혹시나 여기서라면 답이 나오지 않을까 해서.. [1]
1001선무당11/29/201114217clickonce+ntd 시스템에서 proxy Server 가 개입되는 경우 cache 해결을 위한 방법... [1]
1000초보개발자11/28/201112785웹서비스용 웹 서버의 SSD 가치에 대해서... [1]
999날쌘돌이11/25/201111979ADFS와 WIF 질문 [1]
998윤용한11/9/201113163File Write 도중 정전 발생 시 대처 방법 있나요? [2]
997조장원11/7/201112660Silverlight 에서의 Auth 방법에 대한 고찰 [2]파일 다운로드1
... 61  62  [63]  64  65  66  67  68  69  70  71  72  73  74  75  ...