一)客户端
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();
}
}
}
分享到:
相关推荐
USB硬件 键盘鼠标控制器 Lao-UKM V3.1 易语言串口通讯简单例子 . 易语言5.11下, 9600波特率 com2 先打开端口,再发送数据, 鼠标移动命令: 02 00 f6 00 00 5位 16进制码 易语言我转换成10进制发送的:02 ...
自动鼠标控制器自动鼠标控制器
主要为大家详细介绍了Unity3D实现鼠标控制旋转转盘,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
PS2鼠标控制实验、鼠标、单片机、PS2
通过opengl绘制三维模型,通过鼠标控制可以旋转模型,vs2010编写。
鼠标控制音量鼠标控制音量鼠标控制音量鼠标控制音量鼠标控制音量鼠标控制音量鼠标控制音量鼠标控制音量
mvc 鼠标控制 人物八个方向移动 提供源代码
里面是一个简单的demo,实现用鼠标控制视角的变换。
基于vs2010,建立mfc框架的opengl编程,同时加入鼠标控制,可以使视图进行旋转和缩放,代码亲测有效
OpenCV实现的鼠标控制器。 运用Opencv库实现的一个鼠标控制器, 可以用手势来控制鼠标。
VS2019工程,基于OpenGL的C++语言,亲自测试,鼠标控制3D,鼠标左键控制旋转,右键平移。下载后,可自行修改。 本工程简要说明资源:https://blog.csdn.net/hgaohr1021/article/details/115244866
这个程序可以实现鼠标控制小球,使它不掉下来。鼠标一点小球就上去。这个资源中含有源代码。相互学习哦。O(∩_∩)O~
js 特效 html 特效 鼠标控制滚动文字 js 特效 html 特效 鼠标控制滚动文字
3D图形编程+键盘控制+鼠标控制,非常有用的一个实例,欢迎大家下载
vfp编写的鼠标控制上位机,用于从串口接收加速度传感器数据从而控制鼠标,目前很简陋只是初步试验
unity中 点击一个物体飞出 然后鼠标控制放大缩小 任意角度旋转
HTML5鼠标控制树镜动画特效是一款基于Canvas实现的酷炫动画特效下载。
使用labview编写的鼠标控制智能小车,实现小车的前进倒退,左转右转。值得大家学习
matlab开发-使用鼠标控制的JuliaseTBoundary近似值。显示使用逆迭代的Julia集边界近似值。鼠标可控。
js图片左右无缝滚动用鼠标控制图片滚动 js图片左右无缝滚动用鼠标控制图片滚动 js图片左右无缝滚动用鼠标控制图片滚动