鼠标控制

 

一)客户端

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();
        }
    }
}

转载于:https://www.cnblogs.com/sunxiangfu/archive/2008/12/03/4261138.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/268766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java resourcebundle_Java - Properties和ResourceBundle类学习

一、前言在项目的开发过程中,为了统一配置的管理,我们经常需要将一些配置信息根据环境的不同,配置在不同的properties中,然后从里面进行读取。而Properties类作为最基础也是最经常使用的类,通过本文我们来学习一下它的…

Java中Collections.singletonList用法

Collections.singletonList()返回的是不可变的集合,但是这个长度的集合只有1,可以减少内存空间。但是返回的值依然是Collections的内部实现类,同样没有add的方法,调用add,set方法会报错 调用add方法报错 Exception in…

最近找工作的面试经历

来到广州已经一个星期了&#xff0c;招聘会参加了两场&#xff0c;面试了三间公司&#xff0c;但都是通知回去等结果。回想一下这几天的面试经历&#xff0c;感觉自己要学的东西还很多。 <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office&quo…

CF Round410 D. Mike and distribution

D. Mike and distribution 构造法 798D - Mike and distribution In the beginning, its quite easy to notice that the condition " 2(ap1  ...  apk) is greater than the sum of all elements in A " is equivalent to " ap1  ...  apk is greater …

OOAD实践之路——真实案例解析OO理论与实践(二、第一项任务:特性列表)

查看本系列全部文章&#xff1a;《OOA&D实践之路——真实案例解析OO理论与实践》索引贴 第一份说明 当这个项目开始时&#xff0c;我们得到的关于我们要做的系统的唯一说明是一页Word文档&#xff0c;这是一份简单的不能再简单的说明。文档里只有一行字&#xff1a;我…

CSS3常用属性及用法

1.transition: 过渡属性&#xff0c;可以替代flash和javascript的效果 兼容性&#xff1a;Internet Explorer 9 以及更早的版本&#xff0c;不支持 transition 属性。 Chrome 25 以及更早的版本&#xff0c;需要前缀 -webkit-。 Safari 需要前缀 -webkit-。 div { transition: …

ADSL提速 从入门到精通

虽然现在的宽带速率已经很快了&#xff0c;但是大家还是希望在以下方面提升一下应用速度&#xff1a;电影BT下载时、在线影音播放时、FTP文件传送时等。广大网友也因此探寻出不少提升宽带速率的方法&#xff0c;那么&#xff0c;都有哪些简单可行的提速方法呢&#xff1f;它们的…

Swift开发图解入门

《论语卫灵公》有一段经典对白&#xff1a;『子贡问为仁。子曰&#xff1a;工欲善其事&#xff0c;必先利其器。……』。对于一个程序猿来说&#xff0c;好的工具不意味着一定能产生优质的代码。可是好的工具对提升开发效率的作用还是不言而喻的。想要用Swift做iOS开发。唯一可…

java 负数存储结构_负数在java中的存储和读取过程 | 学步园

问题描述&#xff1a;将-5存储在文本文件中&#xff0c;再读取出来显示到控制台;预备知识&#xff1a;1.在java中使用补码处理数字&#xff0c;而且byte(8)的数字在扩展成int(32)类型的时候&#xff0c;正数填充0&#xff0c;负数填充1;2.负数的转变过程&#xff0c;正数的原码…

爆笑:可怜的话剧演员

地点&#xff1a;中央戏剧学院的话剧排练场。   事件&#xff1a;一场文艺剧目的排练。   人物&#xff1a;一男一女。   女&#xff08;羞涩的&#xff09;&#xff1a;我看啊&#xff0c;咱俩的婚事儿&#xff0c;都是你妈逼的。   男&#xff08;憨笑著&#xff0…

获取文本中你须要的字段的 几个命令 grep awk cut tr sed

1,grep 2,awk 3,cut 4,tr 5,sed 实例1 获取本地IP地址 /sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6 | awk {print $2} | tr -d "addr:" 实例2 sed 的使用。去掉某字段 前后的值 grep "select" slow.log | grep "from" | s…

一升的眼泪 日记原文+剧照

作者 木藤亚也14岁——我的家人  “我不能活动&#xff0c;可是我想活着……”   然而&#xff0c;我怎么也想不到&#xff0c;就在我生日这一天&#xff0c;却发生了一场悲剧——玛丽被邻居家养的大狗“老虎”咬破头&#xff0c;死了。玛丽虽然身体小小的&#x…

[补档]暑假集训D5总结

%dalao 今天又有dalao来讲课&#xff0c;讲的是网络流网络流——从入门到放弃&#xff1a;7-29dalao讲课笔记——https://hzoi-mafia.github.io/2017/07/29/27/果然是从入门到放弃啊&#xff0c;dalao本来说好下午继续讲完的&#xff0c;然后——就没有然后了重要的是&#xff…

在多线程中使用UDP

在多线程中使用UDP来自&#xff1a;painboy, 时间&#xff1a;2004-8-8 11:34:40, ID&#xff1a;2754268 type TUdpThread class(TThread) private FData : PChar; //数据区 FBytes : Integer; //数据区大小 FFromIP : string; //UDP的…

主流浏览器Cssjs hack写法

参考&#xff1a; BROWSER HACKS 主流浏览器的Hack写法 转载于:https://www.cnblogs.com/huangtailang/p/7279634.html

java管道流文件的复制_JavaIO 总结笔记三 基本字节字符输入输出流和文件复制...

一、IO体系1.流主要分两大类&#xff1a;字节流 字符流2.在硬盘上的文件&#xff0c;都是以二进制字节形式存储的&#xff0c;所以不管啥文件&#xff0c;读写时都应该用字节流3.在java的早期版本中&#xff0c;的确只有字节流&#xff0c;没有字符流4.一个数字或字母占1个字节…

mysql+phpmyadmin配置流程

mysqlphpmyadmin配置流程&#xff1a;环境&#xff1a;Apachephp5mysql5下载包&#xff1a;phpMyAdmin-2.11.9.4-all-languages-utf-8-only.tar.gz不能下就到这里下载 [url]http://www.phpmyadmin.net/home_page/downloads.php[/url]一&#xff1a;安装配置1> 安装包&#x…