이번에는 원격 제어할 때 대상 호스트의 화면을 표시하는 RemoteCleintForm 폼을 추가하세요.
자식 컨트롤로 PictureBox 컨트롤을 추가하고 이름을 pbox_remote으로 정합시다. PictureBox 컨트롤의 Dock 속성을 Fill로 설정하고 SizeMode 속성르 StretchImage로 설정하세요.
멤버 필드로 이미지를 수신하였는지 확인하는 멤버와 이미지 크기를 기억할 멤버를 선언하세요.
bool check;//이미지 수신 여부 Size csize; //클라이언트 폼 크기
원격 호스트를 제어하기 위한 키보드와 마우스 이벤트를 전송에 사용할 클라이언트를 속성으로 제공합시다.
SendEventClient EventSC { get { return Controller.Singleton.SendEventClient; } }
속성 창을 이용하여 Load 이벤트 핸들러를 등록하세요.
private void RemoteCleintForm_Load(object sender, EventArgs e) {
컨트롤로의 단일체에 이미지 수신 이벤트 핸드러를 등록하세요.
Controller.Singleton.RecvedImage += new RecvImageEventHandler( Singleton_RecvImageEventHandler); }
void Singleton_RecvImageEventHandler(object sender, RecvImageEventArgs e) {
만약 한 번도 이미지를 수신하지 않았다면 이벤트 클라이언트를 가동하세요.
if (check == false) { Controller.Singleton.StartEventClient(); check = true;
이벤트 인자로 받은 부분은 원격 제어 호스트의 데스크 톱 화면의 크기입니다.
csize = e.Image.Size; }
수신한 이미지로 pbox_remote의 Image 속성을 설정하면 수신한 이미지를 PictureBox에 표시합니다.
pbox_remote.Image = e.Image; }
속성 창을 이용하여 KeyDown 이벤트 핸들러를 등록하세요.
private void RemoteCleintForm_KeyDown(object sender, KeyEventArgs e) { if (check == true) {
check가 true면 제어 중이므로 키 누름 이벤트 정보를 전송합니다.
EventSC.SendKeyDown(e.KeyValue); } }
속성 창을 이용해서 KeyUp 이벤트 핸들러를 등록하세요.
private void RemoteCleintForm_KeyUp(object sender, KeyEventArgs e) { if (check == true) {
check가 true면 제어 중이므로 키 뗌 이벤트 정보를 전송합니다.
EventSC.SendKeyUp(e.KeyValue); } }
속성 창을 이용해서 pbox_remote 컨트롤의 MouseMove 이벤트 핸들러를 등록하세요.
private void pbox_remote__MouseMove(object sender, MouseEventArgs e) {
check가 true면 제어 중이므로 마우스 이동 정보를 전송합니다. 이 때 좌표는 원격 제어 호스트 화면 크기에 맞게 변환하여 전송합니다.
if (check == true) { Point pt = ConvertPoint(e.X, e.Y); EventSC.SendMouseMove(pt.X, pt.Y); } }
좌표를 변환하는 ConvertPoint 메서드를 추가하세요.
private Point ConvertPoint(int x, int y) {
x좌표는 원격 호스트의 너비를 곱한 값을 pbox_remote의 너비로 나눈 값으로 변환합니다.
int nx = csize.Width * x / pbox_remote.Width;
y좌표는 원격 호스트의 높이를 곱한 값을 pbox_remote의 높이로 나눈 값으로 변환합니다.
int ny = csize.Height * y / pbox_remote.Height;
변환한 nx, ny로 Point 개체를 만들어 반환하세요.
return new Point(nx, ny); }
속성 창을 이용하여 pbox_remote 컨트롤의 MouseDown 이벤트 핸들러를 등록하세요.
private void pbox_remote_MouseDown(object sender, MouseEventArgs e) {
check가 true면 제어 중이므로 마우스 누름 이벤트 정보를 전송합니다.
if (check == true) { Text = e.Location.ToString(); EventSC.SendMouseDown(e.Button); } }
속성 창을 이용하여 pbox_remote 컨트롤의 MouseUp 이벤트 핸들러를 등록하세요.
private void pbox_remote_MouseUp(object sender, MouseEventArgs e) {
check가 true면 제어 중이므로 마우스 뗌 이벤트 정보를 전송합니다.
if (check == true) { EventSC.SendMouseUp(e.Button); } }
다음은 이번 실습에서 작성한 소스 코드입니다.
//RemoteCleintForm.cs using System; using System.Drawing; using System.Windows.Forms; namespace 원격제어기 { /// <summary> /// 원격 클라이언트 폼 /// </summary> public partial class RemoteCleintForm : Form { bool check;//이미지 수신 여부 Size csize; //클라이언트 폼 크기 SendEventClient EventSC { get { return Controller.Singleton.SendEventClient; } } /// <summary> /// 생성자 /// </summary> public RemoteCleintForm() { InitializeComponent(); } private void RemoteCleintForm_Load(object sender, EventArgs e) { Controller.Singleton.RecvedImage += new RecvImageEventHandler(Singleton_RecvImageEventHandler); } void Singleton_RecvImageEventHandler(object sender, RecvImageEventArgs e) { if (check == false) { Controller.Singleton.StartEventClient(); check = true; csize = e.Image.Size; } pbox_remote.Image = e.Image; } private void pbox_remote__MouseMove(object sender, MouseEventArgs e) { if (check == true) { Point pt = ConvertPoint(e.X, e.Y); EventSC.SendMouseMove(pt.X, pt.Y); } } private Point ConvertPoint(int x, int y) { int nx = csize.Width * x / pbox_remote.Width; int ny = csize.Height * y / pbox_remote.Height; return new Point(nx, ny); } private void pbox_remote_MouseDown(object sender, MouseEventArgs e) { if (check == true) { Text = e.Location.ToString(); EventSC.SendMouseDown(e.Button); } } private void pbox_remote_MouseUp(object sender, MouseEventArgs e) { if (check == true) { EventSC.SendMouseUp(e.Button); } } private void RemoteCleintForm_KeyDown(object sender, KeyEventArgs e) { if (check == true) { EventSC.SendKeyDown(e.KeyValue); } } private void RemoteCleintForm_KeyUp(object sender, KeyEventArgs e) { if (check == true) { EventSC.SendKeyUp(e.KeyValue); } } } }