원격 제어 프로그램 19. MainForm

가상 커서와 원격 제어 화면과 상대 IP와 포트를 멤버를 선언합니다.

속성 창을 이용해서 Load 이벤트 핸들러를 등록하세요.

가상 커서 폼과 원격 제어 호스트 화면을 표시할 폼을 생성합니다.

원격 제어 요청을 수신하였을 때의 처리 이벤트 핸들러를 등록합니다.

크로스 스레드 문제가 발생할 수 있으니 다음처럼 문제를 해결하세요. Windows Forms 응용에서는 컨트롤을 소유하고 있는 스레드가 아닌 다른 스레드에서 컨트롤의 상태를 변경하려고 할 때 크로스 스레드 문제가 발생합니다.

이를 확인하려면 컨트롤의 InvokeRequired 속성을 확인합니다. 만약 InvokeRequired 속성이 true라면 현재 수행하는 스레드는 컨트롤을 소유하지 않은 스레드라는 의미입니다. 이 때 컨트롤의 Invoke 메서드를 호출하면 .NET 프레임워크에서는 컨트롤을 소유한 스레드가 대행하게 해 줍니다.

다음은 수신한 상대 정보를 컨트롤을 통해 표시하는 부분으로 크로스 스레드 문제를 해결하는 코드로 작성하였습니다.

상대 IP 주소를 텍스트 박스에 표시하고 IP와 포트 정보를 멤버에 설정합니다.

요청 수락할 수 있게 버튼을 활성화합니다.

속성 창을 이용하여 FormClosed 이벤트 핸들러를 등록하세요.

원격 호스트와 컨트롤러를 멈춥니다.

응용을 종료합니다.

btn_setting 컨트롤의 Click 이벤트 핸들러를 등록하세요.

원격 제어 요청한 IP 주소가 로컬 IP 주소와 같으면 메시지 창으로 통보하고 이벤트 핸들러를 끝냅니다.

입력한 IP 주소를 얻어옵니다.

사각 영역을 구합니다.

원격 제어 컨트롤러를 가동합니다.

테두리를 고려하여 영역 크기를 조정한 후에 원격 제어 화면 폼을 시각화하세요.

btn_ok 컨트롤의 Click 이벤트 핸들러를 등록하세요.

MainForm을 숨깁니다.

원격 제어 이벤트 수신 서버를 가동하여 원격 제어 컨트롤러의 제어 메시지를 수신합니다.

이미지 전송 타이머를 가동하여 주기적으로 데스크 톱 화면을 전송할 수 있게 합니다.

가상 커서를 시각화하여 원격 제어 컨트롤러가 제어하기 쉽게 해 줍니다.

noti 컨트롤의 MouseDoubleClick 이벤트 핸들러를 등록하세요.

숨겼던 자신을 시각화합니다.

이미지 전송 타이머인 timer_send_img 컨트롤의 Tick 이벤트 핸들러를 등록하세요.

사각 영역을 구하여 비트맵 개체를 생성하고 Graphics 개체를 생성합니다.

Graphics 개체로 화면을 복사합니다.

복사한 이미지를 비동기로 전송합니다.

예외가 발생하면 프로그램을 닫습니다.

이상으로 원격 제어 프로그램 만들기가 끝났습니다. 테스트를 해 보시고 보다 나은 프로그램으로 수정해 보세요.

다음은 이번 실습에서 작성한 소스 코드입니다.

이상으로 원격 제어 프로그램에 관한 소개를 마칠게요. 여러분께서는 비동기 소켓 통신으로 버그를 개선하고 다른 기술과 융합하여 보다 나은 프로그램을 작성할 수 있기를 기대합니다.