鼠标控制
?
一)客戶端
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
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: VirtualBox更改默认路径
- 下一篇: 最近找工作的面试经历