在客户端收到socket发送过来的消息时首先对收到的二进制数组进行解析,解析为具体的坐标:
if (!isOpenSocket)
continue;
///接受从服务器返回的信息
string recvStr = "";
byte[] recvBytes = new byte[2048];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
List<string> list = new List<string>(recvStr.Split(','));
var arr = list.ToArray();
因为鼠标钩子两次收到的坐标不连续,所以可能会导致一次连续的画线操作中间断开,因此如果判断他没有一个坐标为-1,-1即我所使用的鼠标释放操作的坐标值,则将这次的第一个点和上一次手打的最后一个点连接起来
if (x != -1 && int.Parse(arr[0])!=-1)
{
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE, x * 65536 / 1920, y * 65536 / 1080, 0, 0);
Cursor.Position = new System.Drawing.Point(int.Parse(arr[0]), int.Parse(arr[1]));
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}
使用mouse_event模拟鼠标点击操作,因为 mouse_event模拟鼠标移动操作总是产生鼠标乱飘的问题,因此使用Cursor.Position = new System.Drawing.Point(int.Parse(arr[0]), int.Parse(arr[1]));操作来完成鼠标的移动操作,在循环开始时进行鼠标按下操作,在结束时进行鼠标释放操作会导致鼠标释放总是没有成功实现,从而导致鼠标一直处于按下的状态,因此在将两个点连接起来操作的时候独立进行按下,移动,释放操作,使用这个方法的同时也可以避免在一个用户进行共享的时候,查看共享的用户进行操作导致整个分享画的线条出错。
连接收到的坐标和存储最后一个点的代码:
for (int i = 0; i < arr.Count(); i = i + 2)
{
//int X = int.Parse(arr[i]) * 65536 / 1920;
//int Y = int.Parse(arr[i + 1]) * 65536 / 1080;
int X = int.Parse(arr[i]);
int Y = int.Parse(arr[i + 1]);
if (X == -1)
continue;
if (i != 0)
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE, int.Parse(arr[i - 2]) * 65536 / 1920, int.Parse(arr[i - 1]) * 65536 / 1080, 0, 0);
Cursor.Position = new System.Drawing.Point(X, Y);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
//mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, X, Y, 0, 0);
}
x = int.Parse(arr[arr.Count() - 2]);
y = int.Parse(arr[arr.Count() - 1]);