원격 제어 프로그램 18. 원격 클라이언트 폼

이번에는 원격 제어할 때 대상 호스트의 화면을 표시하는 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);
            }

        }
    }
}