鼠标控制

 

一)客户端

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
using System.Threading;

 

 

namespace 鼠标控制_客户端
{
    //我们定义一个保存鼠标坐标的结构
    public struct MousePosition
    {
        private int x;
        private int y;
        public int X
        {
            get
            {
                return x;
            }
        }
        public int Y
        {
            get
            {
                return y;
            }
        }
    }

 

 

 

    class Class1
    {
        //声明GetCursorPos函数,该函数只有一个参数,这是一个out类型的参数,获取的坐标就保存//在该输出参数里面,成功返回真,反正为假。
        [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "GetCursorPos")]
        public extern static bool GetCursorPos(out MousePosition lpPoint);

 

 

 

        [STAThread]
        static void Main(string[] args)
        {
            byte[] data = new byte[100];          //初始化一个byte数组,用来传递信息
            string strData;
            MousePosition mp;

 

 

            // IPEndPoint为一个指定IP以及端口的类,构造函数中要求一个IPAddress类型的IP,我//们用IPAddress.Parse把一个string类型的转换为IPAddress,第2个参数为端口号,这里//用的是60000,当然只要不和当前已用端口冲突,随便指定什么都可以,需要说明的是,//如果用TCP协议,客户端与服务端使用的端口必须同意,而用UDP就没关系。

 

 

            //127.0.0.1是我用的,这个根据自己的网络情况改

 

 

            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 60000);

            // 构造一个套节字,第一个参数指定为 InterNetwork及为IP版本4的地址。第二个参数为
            // 套接字类型,Stream为支持可靠、双向、基于连接的字节流,而不重复数据,无边界,若
            // ProtocolType参数为tcp,需指定套接字类型为stream。具体使用请参见  
            //ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemnetsocketssockettypeclasstopic.htm
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                //连接到指定的主机既服务端,参数ipep指定的IP为10.0.0.9,端口为60000的IPEndPoint
                client.Connect(ipep);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadLine();
                return;
            }
            //声明一个数据流,把他绑定到刚才的连接,这个用法比Send更方便,在将NetworkStream
            //绑定到一个StreamWriter上,这样把数据写到数据流中就仅需要调用Write或WriteLine
            //方法,而读数据则调用Read或ReadLine方法,比起用send和Receive方法比要简单得多。
            //下面的注释项给出了不用数据流的方法,需要用到我们刚才声明的byte数组。
            NetworkStream ns = new NetworkStream(client);
            StreamWriter sw = new StreamWriter(ns);

            //在循环中不断的向服务端发送鼠标坐标的信息
            while (true)
            {
                GetCursorPos(out mp);
                //我们将鼠标的坐标保存到一个string中,并用‘,’号分割。
                strData = mp.X.ToString() + "," + mp.Y.ToString();
                // Socket实例的Send方法只接受byte的参数,所以需要把strData转换为用ASCII编码
                //的byte[],这里用的ASCII编码,服务端也要用ASCII解码,如果传递中文信息,比如
                //聊天工具,则需要用utf-8或其他的。
                //                   data = Encoding.ASCII.GetBytes(strData);
                //               client.Send(data);
                sw.WriteLine(strData);//将信息写入数据流,发到服务端
                sw.Flush();
                Thread.Sleep(10);
            }

 

 

            //释放
            sw.Close();
            ns.Close();
            client.Shutdown(SocketShutdown.Both);
            client.Close();
        }
    }
}

 

二)服务器

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;

namespace 鼠标控制_服务端
{
    class Class1
    {
        //这个API 用于指定鼠标坐标,一看就明白
        [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetCursorPos")]
        public extern static bool SetCursorPos(int x, int y);

        [STAThread]
        static void Main(string[] args)
        {
            //和前面一样
            byte[] data = new byte[100];
            string strData;

 

 

            //这个地方我们没有指定具体的ip,IPAddress.Any的意思是指示服务器应侦听所有网络
            //接口上的客户端活动。
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 60000);
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //将套接字绑定到指定IPEndPoint,并开始监听60000端口
            server.Bind(ipep);
            server.Listen(10);

 

 

            Console.WriteLine("等待连接");

            Socket control = server.Accept();
            // Accept方法为以同步方式从侦听套接字的连接请求队列中提取第一个挂起的连接请求,
            //然后创建并返回新的 Socket。不能使用返回的这个 Socket 接受连接队列中的任何附加连//接。然而,可以调用返回的 Socket 的 RemoteEndPoint 法来标识远程主机的网络地址//和端口号。在阻塞模式中,Accept 将会持续处于阻塞状态,直到传入的连接尝试进入队//列。在接受//连接之后,原来的Socket 将会继续把传入的连接请求放入队列,直到将其关//闭。这是msdn上的解释,可能看起来有点模糊,意思可以简单理解为,若有连接接入则//继续向下执行,若没有,则挂起等待,直到有连接接入。

 

 

            Console.WriteLine("连接到");
            NetworkStream ns = new NetworkStream(control);
            StreamReader sr = new StreamReader(ns);
            while (true)
            {
                try
                {
                    //从数据流中读出数据,既读取客户端发来的信息
                    strData = sr.ReadLine();
                }
                catch (Exception)
                {
                    return;
                }

 

 

                //以下的注释用Receive方法来读出数据而非数据流,该方法返回一个int数据,极为数据的长度,如果不
                //为0,则用ASCII解码到string中,刚才我们用‘,’号分割x坐标和y坐标,现在我们在把他分开,保存
                //到2个int中
                //                 int recv = control.Receive(data);
                //                 if(recv == 0)
                //                     break;
                //                 strData = Encoding.ASCII.GetString(data,0,recv);
                int index = strData.IndexOf(',');
                string strx = strData.Substring(0, index);
                string stry = strData.Substring(index + 1);
                int x = Convert.ToInt32(strx);
                int y = Convert.ToInt32(stry);
                //用这个api可以设置鼠标的坐标,而这个坐标是与客户端同步的
                SetCursorPos(x, y);
               // SetCursorPos(0, 0);
            }
            sr.Close();
            ns.Close();
            control.Close();
            server.Close();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值