C# socket 服务端与客户端通信演示代码
程序员文章站
2022-03-06 16:52:15
...
C# socket 服务端与客户端通信演示代码
主要实现服务端与客户端消息和文件的相互发送,服务端可以控制客户端:重启、关机、注销,截屏(截客户端的屏)。服务端也可向客户端发送闪屏。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Net; using System.Net.Sockets; using System.Text; using System.Windows.Forms; using System.IO; using System.Threading; using System.Runtime.InteropServices; public delegate void DGShowMsg(string strMsg); namespace Server { public partial class Form1 : Form { public Form1() { InitializeComponent(); TextBox.CheckForIllegalCrossThreadCalls = false;//关闭跨线程修改控件检查 // txtIP.Text = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0].ToString(); txtIP.Text = Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString(); } [DllImport("kernel32")] ///获取系统时间 public static extern void GetSystemTime(ref SYSTEMTIME_INFO stinfo); ///定义系统时间结构信息 [StructLayout(LayoutKind.Sequential)] public struct SYSTEMTIME_INFO { public ushort wYear; public ushort wMonth; public ushort wDayOfWeek; public ushort wDay; public ushort wHour; public ushort wMinute; public ushort wSecond; public ushort wMilliseconds; } Socket sokWatch = null;//负责监听 客户端段 连接请求的 套接字(女生宿舍的大妈) Thread threadWatch = null;//负责 调用套接字, 执行 监听请求的线程 //开启监听 按钮 private void btnStartListen_Click(object sender, EventArgs e) { //实例化 套接字 (ip4寻址协议,流式传输,TCP协议) sokWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建 ip对象 IPAddress address = IPAddress.Parse(txtIP.Text.Trim()); // IPAddress[] addressList = Dns.GetHostEntry(Dns.GetHostName()).AddressList; //string ip= this.geta //创建网络节点对象 包含 ip和port // IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim())); comboBox1.Text.Trim(); IPEndPoint endpoint = new IPEndPoint(address, int.Parse(comboBox1.Text.Trim())); //将 监听套接字 绑定到 对应的IP和端口 sokWatch.Bind(endpoint); //设置 监听队列 长度为10(同时能够处理 10个连接请求) sokWatch.Listen(20); threadWatch = new Thread(StartWatch); threadWatch.IsBackground = true; threadWatch.Start(); //txtShow.AppendText("启动服务器成功......rn"); label4.Text = "启动服务器成功......"; } //DictionarydictSocket = new Dictionary (); Dictionary dictConn = new Dictionary (); bool isWatch = true; #region 1.被线程调用 监听连接端口 /// /// 被线程调用 监听连接端口 /// void StartWatch() { string recode; while (isWatch) { //threadWatch.SetApartmentState(ApartmentState.STA); //监听 客户端 连接请求,但是,Accept会阻断当前线程 Socket sokMsg = sokWatch.Accept();//监听到请求,立即创建负责与该客户端套接字通信的套接字 ConnectionClient connection = new ConnectionClient(sokMsg, ShowMsg, RemoveClientConnection); //将负责与当前连接请求客户端 通信的套接字所在的连接通信类 对象 装入集合 dictConn.Add(sokMsg.RemoteEndPoint.ToString(), connection); //将 通信套接字 加入 集合,并以通信套接字的远程IpPort作为键 //dictSocket.Add(sokMsg.RemoteEndPoint.ToString(), sokMsg); //将 通信套接字的 客户端IP端口保存在下拉框里 cboClient.Items.Add(sokMsg.RemoteEndPoint.ToString()); MessageBox.Show("有一个客户端新添加!"); recode = sokMsg.RemoteEndPoint.ToString(); //调用GetSystemTime函数获取系统时间信息 SYSTEMTIME_INFO StInfo; StInfo = new SYSTEMTIME_INFO(); GetSystemTime(ref StInfo); recode +="子计算机在"+StInfo.wYear.ToString() + "年" + StInfo.wMonth.ToString() + "月" + StInfo.wDay.ToString() + "日"; recode += (StInfo.wHour + 8).ToString() + "点" + StInfo.wMinute.ToString() + "分" + StInfo.wSecond.ToString() + "秒"+"连接服务"; //记录每台子计算机连接服务主机的日志 StreamWriter m_sw = new StreamWriter(System.Windows.Forms.Application.StartupPath + @"\file.DAT", true); m_sw.WriteLine(recode); m_sw.WriteLine("------------------------------------------------------------------"); m_sw.Close(); //MessageBox.Show(recode); dictConn[sokMsg.RemoteEndPoint.ToString()].SendTrue(); //启动一个新线程,负责监听该客户端发来的数据 //Thread threadConnection = new Thread(ReciveMsg); //threadConnection.IsBackground = true; //threadConnection.Start(sokMsg); } } #endregion //bool isRec = true; //与客户端通信的套接字 是否 监听消息 #region 发送消息 到指定的客户端 -btnSend_Click //发送消息 到指定的客户端 private void btnSend_Click(object sender, EventArgs e) { //byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(txtInput.Text.Trim()); //从下拉框中 获得 要哪个客户端发送数据 string time; string connectionSokKey = cboClient.Text; if (!string.IsNullOrEmpty(connectionSokKey)) { //从字典集合中根据键获得 负责与该客户端通信的套接字,并调用send方法发送数据过去 dictConn[connectionSokKey].Send(txtInput.Text.Trim()); SYSTEMTIME_INFO StInfo; StInfo = new SYSTEMTIME_INFO(); GetSystemTime(ref StInfo); time = StInfo.wYear.ToString() + "/" + StInfo.wMonth.ToString() + "/" + StInfo.wDay.ToString() +" "; time += (StInfo.wHour + 8).ToString() + ":" + StInfo.wMinute.ToString(); richTextBox1.AppendText(time + "rn"); richTextBox1.AppendText("对" + cboClient.Text +"说:"+ txtInput.Text.Trim() + "rn"); txtInput.Text = ""; //sokMsg.Send(arrMsg); } else { MessageBox.Show("请选择要发送的子计算机~~"); } } #endregion //发送闪屏 private void btnShack_Click(object sender, EventArgs e) { string connectionSokKey = cboClient.Text; if (!string.IsNullOrEmpty(connectionSokKey)) { dictConn[connectionSokKey].SendShake(); } else { MessageBox.Show("请选择要发送的子计算机~~"); } } //群闪 private void btnShackAll_Click(object sender, EventArgs e) { foreach (ConnectionClient conn in dictConn.Values) { conn.SendShake(); } } #region 2 移除与指定客户端的连接 +void RemoveClientConnection(string key) ////// 移除与指定客户端的连接 /// /// 指定客户端的IP和端口 public void RemoveClientConnection(string key) { if (dictConn.ContainsKey(key)) { dictConn.Remove(key); MessageBox.Show(key +"断开连接"); cboClient.Items.Remove(key); } } #endregion //选择要发送的文件 private void btnChooseFile_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { txtFilePath.Text = ofd.FileName; } } //发送文件 private void btnSendFile_Click(object sender, EventArgs e) { //拿到下拉框中选中的客户端IPPORT string key = cboClient.Text; if (!string.IsNullOrEmpty(key)) { dictConn[key].SendFile(txtFilePath.Text.Trim()); // txtFilePath.Text = ""; } else { MessageBox.Show("请选择要发送的子计算机~"); } } #region 向文本框显示消息 -void ShowMsg(string msgStr) ////// 向文本框显示消息 /// /// 消息 public void ShowMsg(string msgStr) { //MessageBox.Show("1040414"); txtShow1.AppendText(msgStr + "rn"); } #endregion //群消息 private void btnSendMsgAll_Click(object sender, EventArgs e) { string time; foreach (ConnectionClient conn in dictConn.Values) { conn.Send(txtInput.Text.Trim()); } SYSTEMTIME_INFO StInfo; StInfo = new SYSTEMTIME_INFO(); GetSystemTime(ref StInfo); time = StInfo.wYear.ToString() + "/" + StInfo.wMonth.ToString() + "/" + StInfo.wDay.ToString() + " "; time += (StInfo.wHour + 8).ToString() + ":" + StInfo.wMinute.ToString(); richTextBox1.AppendText(time + "rn"); richTextBox1.AppendText("群发消息:"+ txtInput.Text.Trim() + "rn"); txtInput.Text = ""; } //群发文件 private void button1_Click(object sender, EventArgs e) { foreach (ConnectionClient conn in dictConn.Values) { // dictConn.SendFile(txtFilePath.Text.Trim()); conn.SendFile(txtFilePath.Text.Trim()); } } private void button2_Click(object sender, EventArgs e) { string connectionSokKey = cboClient.Text; if (!string.IsNullOrEmpty(connectionSokKey)) { dictConn[connectionSokKey].guanji(); } else { MessageBox.Show("请选择要发送的子计算机~~"); } } private void button3_Click(object sender, EventArgs e) { string connectionSokKey = cboClient.Text; if (!string.IsNullOrEmpty(connectionSokKey)) { dictConn[connectionSokKey].chongqi(); } else { MessageBox.Show("请选择要发送的子计算机~~"); } } private void button4_Click(object sender, EventArgs e) { string connectionSokKey = cboClient.Text; if (!string.IsNullOrEmpty(connectionSokKey)) { dictConn[connectionSokKey].zhuxiao(); } else { MessageBox.Show("请选择要发送的子计算机~~"); } } private void button5_Click(object sender, EventArgs e) { string connectionSokKey = cboClient.Text; if (!string.IsNullOrEmpty(connectionSokKey)) { dictConn[connectionSokKey].jieping(); } else { MessageBox.Show("请选择要发送的子计算机~~"); } } } /////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// ////在这里,我新建了一个与客户端的通信和线程的类(ConnectionClient)////////////////////// ////// 与客户端的 连接通信类(包含了一个 与客户端 通信的 套接字,和线程) /// public class ConnectionClient { Socket sokMsg; DGShowMsg dgShowMsg;//负责 向主窗体文本框显示消息的方法委托 DGShowMsg dgRemoveConnection;// 负责 从主窗体 中移除 当前连接 Thread threadMsg; #region 构造函数 ////// /// /// 通信套接字 /// 向主窗体文本框显示消息的方法委托 public ConnectionClient(Socket sokMsg, DGShowMsg dgShowMsg, DGShowMsg dgRemoveConnection) { this.sokMsg = sokMsg; this.dgShowMsg = dgShowMsg; this.dgRemoveConnection = dgRemoveConnection; this.threadMsg = new Thread(RecMsg); this.threadMsg.IsBackground = true; this.threadMsg.Start(); } #endregion bool isRec = true; #region 02负责监听客户端发送来的消息 void RecMsg() { while (isRec) { try { byte[] arrMsg = new byte[1024 * 1024 * 1]; //接收 对应 客户端发来的消息 int length = sokMsg.Receive(arrMsg); // string abc = Encoding.Default.GetString(arrMsg); // MessageBox.Show(abc); //将接收到的消息数组里真实消息转成字符串 if (arrMsg[0] == 1) { //string abc = Encoding.Default.GetString(arrMsg); //MessageBox.Show(abc); //发送来的是文件 //MessageBox.Show("00000s"); //SaveFileDialog sfd = new SaveFileDialog(); SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "文本文件(.txt)|*.txt|所有文件(*.*)|*.*"; // MessageBox.Show(sfd.Filter); //sfd.ShowDialog(); //弹出文件保存选择框 if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { //MessageBox.Show("111110"); //创建文件流 using (FileStream fs = new FileStream(sfd.FileName, FileMode.OpenOrCreate)) { fs.Write(arrMsg, 1, length - 1); MessageBox.Show("文件保存成功!"); } } } /*else if(arrMsg[0] == 2) { // MemoryStream ms = new MemoryStream(arrMsg, 0, length-1); MemoryStream ms = new MemoryStream(arrMsg); Image returnImage = Image.FromStream(ms);//?????????? PictureBox district = (PictureBox)Application.OpenForms["Form1"].Controls["pictureBox1"].Controls["pictureBox1"]; district.Image = returnImage; // this.saveFileDialog1.FileName = "";//清空名称栏 /* SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "图像文件(.jpg)|*.jpg|所有文件(*.*)|*.*"; MessageBox.Show(sfd.Filter); if (DialogResult.OK == sfd.ShowDialog()) { string strFileName = sfd.FileName; //Image img = (Image)this.pictureBox1.Image; returnImage.Save(strFileName); } }*/ else//发送来的是消息 { //MessageBox.Show("2222"); string strMsg = sokMsg.RemoteEndPoint.ToString()+"说:"+"rn"+System.Text.Encoding.UTF8.GetString(arrMsg, 0, length); //// 我在这里 Request.ServerVariables.Get("Remote_Addr").ToString()+ //通过委托 显示消息到 窗体的文本框 dgShowMsg(strMsg); } //MessageBox.Show("11111"); } catch (Exception ex) { isRec = false; //从主窗体中 移除 下拉框中对应的客户端选择项,同时 移除 集合中对应的 ConnectionClient对象 dgRemoveConnection(sokMsg.RemoteEndPoint.ToString()); } } } #endregion #region 03向客户端发送消息 ////// 向客户端发送消息 /// /// public void Send(string strMsg) { byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg); byte[] arrMsgFinal = new byte[arrMsg.Length + 1]; arrMsgFinal[0] = 0;//设置 数据标识位等于0,代表 发送的是 文字 arrMsg.CopyTo(arrMsgFinal, 1); sokMsg.Send(arrMsgFinal); } #endregion #region 04向客户端发送文件数据 +void SendFile(string strPath) ////// 04向客户端发送文件数据 /// /// 文件路径 public void SendFile(string strPath) { //通过文件流 读取文件内容 //MessageBox.Show("12540"); using (FileStream fs = new FileStream(strPath, FileMode.OpenOrCreate)) { byte[] arrFile = new byte[1024 * 1024 * 2]; //读取文件内容到字节数组,并 获得 实际文件大小 int length = fs.Read(arrFile, 0, arrFile.Length); //定义一个 新数组,长度为文件实际长度 +1 byte[] arrFileFina = new byte[length + 1]; arrFileFina[0] = 1;//设置 数据标识位等于1,代表 发送的是文件 //将 文件数据数组 复制到 新数组中,下标从1开始 //arrFile.CopyTo(arrFileFina, 1); Buffer.BlockCopy(arrFile, 0, arrFileFina, 1, length); // MessageBox.Show("120"); //发送文件数据 sokMsg.Send(arrFileFina);//, 0, length + 1, SocketFlags.None); } } #endregion #region 05向客户端发送闪屏 ////// 向客户端发送闪屏 /// /// public void SendShake() { byte[] arrMsgFinal = new byte[1]; arrMsgFinal[0] = 2; sokMsg.Send(arrMsgFinal); } #endregion #region 06关闭与客户端连接 ////// 关闭与客户端连接 /// public void CloseConnection() { isRec = false; } #endregion #region 07向客户端发送连接成功提示 ////// 向客户端发送连接成功提示 /// /// public void SendTrue() { byte[] arrMsgFinal = new byte[1]; arrMsgFinal[0] = 3; sokMsg.Send(arrMsgFinal); } #endregion #region 08向客户端发送关机命令 ////// 向客户端发送关机命令 /// /// public void guanji() { byte[] arrMsgFinal = new byte[1]; arrMsgFinal[0] = 4; sokMsg.Send(arrMsgFinal); } #endregion #region 09向客户端发送重启命令 ////// 向客户端发送关机命令 /// /// public void chongqi() { byte[] arrMsgFinal = new byte[1]; arrMsgFinal[0] = 5; sokMsg.Send(arrMsgFinal); } #endregion #region 10向客户端发送待机命令 ////// 向客户端发送关机命令 /// /// public void zhuxiao() { byte[] arrMsgFinal = new byte[1]; arrMsgFinal[0] = 6; sokMsg.Send(arrMsgFinal); } #endregion #region 11向客户端发送截屏命令 ////// 向客户端发送截屏命令 /// /// public void jieping() { byte[] arrMsgFinal = new byte[1]; arrMsgFinal[0] = 7; sokMsg.Send(arrMsgFinal); } #endregion } }
客户端
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Net.Sockets; using System.Net; using System.Threading; using System.Windows.Forms; using System.IO; using System.Text; using System.Runtime.InteropServices; public delegate void DGShowMsg(string strMsg); namespace Client { public partial class Form1 : Form { public Form1() { InitializeComponent(); TextBox.CheckForIllegalCrossThreadCalls = false; } #region[成员函数] //////图像函数 /// private Image _img; #endregion [StructLayout(LayoutKind.Sequential, Pack = 1)] internal struct TokPriv1Luid { public int Count; public long Luid; public int Attr; } [DllImport("kernel32.dll", ExactSpelling = true)] internal static extern IntPtr GetCurrentProcess(); [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok); [DllImport("advapi32.dll", SetLastError = true)] internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid); [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen); [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)] internal static extern bool ExitWindowsEx(int flg, int rea); internal const int SE_PRIVILEGE_ENABLED = 0x00000002; internal const int TOKEN_QUERY = 0x00000008; internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020; internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege"; internal const int EWX_LOGOFF = 0x00000000; //注销 internal const int EWX_SHUTDOWN = 0x00000001; //关机 internal const int EWX_REBOOT = 0x00000002; //重启 internal const int EWX_FORCE = 0x00000004; internal const int EWX_POWEROFF = 0x00000008; //断开电源 internal const int EWX_FORCEIFHUNG = 0x00000010; //强制终止未响应的程序 // internal const int WM_POWERBROADCAST private static void DoExitWin(int flg) { bool ok; TokPriv1Luid tp; IntPtr hproc = GetCurrentProcess(); IntPtr htok = IntPtr.Zero; ok = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok); tp.Count = 1; tp.Luid = 0; tp.Attr = SE_PRIVILEGE_ENABLED; ok = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tp.Luid); ok = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero); ok = ExitWindowsEx(flg, 0); } Socket sokClient = null;//负责与服务端通信的套接字 Thread threadClient = null;//负责 监听 服务端发送来的消息的线程 bool isRec = true; //是否循环接收服务端数据 // DictionarydictConn = new Dictionary (); private void btnConnect_Click(object sender, EventArgs e) { //实例化 套接字 sokClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建 ip对象 IPAddress address = IPAddress.Parse(txtIP.Text.Trim()); //MessageBox.Show("address"); //创建网络节点对象 包含 ip和port IPEndPoint endpoint = new IPEndPoint(address, int.Parse(comboBox1.Text.Trim())); //连接 服务端监听套接字 sokClient.Connect(endpoint); //创建负责接收 服务端发送来数据的 线程 threadClient = new Thread(ReceiveMsg); threadClient.IsBackground = true; //如果在win7下要通过 某个线程 来调用 文件选择框的代码,就需要设置如下 threadClient.SetApartmentState(ApartmentState.STA); threadClient.Start(); } /// /// 接收服务端发送来的消息数据 /// void ReceiveMsg() { while (isRec) { byte[] msgArr = new byte[1024 * 1024 * 1];//接收到的消息的缓冲区 int length = 0; //接收服务端发送来的消息数据 length = sokClient.Receive(msgArr);//Receive会阻断线程 if (msgArr[0] == 0)//发送来的是文字 { string strMsg = System.Text.Encoding.UTF8.GetString(msgArr, 1, length - 1); txtShow.AppendText(strMsg + "rn"); } else if (msgArr[0] == 1) { //发送来的是文件 //string abc = Encoding.Default.GetString(msgArr); //MessageBox.Show(abc); SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "文本文件(.txt)|*.txt|所有文件(*.*)|*.*"; //弹出文件保存选择框 if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { //创建文件流 using (FileStream fs = new FileStream(sfd.FileName, FileMode.OpenOrCreate)) { fs.Write(msgArr, 1, length - 1); MessageBox.Show("文件保存成功!"); } } } else if (msgArr[0] == 2) { ShakeWindow(); } else if (msgArr[0] == 3) { MessageBox.Show("连接成功"); } else if (msgArr[0] == 4) { DoExitWin(EWX_SHUTDOWN); } else if (msgArr[0] == 5) { DoExitWin(EWX_REBOOT); } else if (msgArr[0] == 6) { DoExitWin(EWX_LOGOFF); } else if (msgArr[0] == 7) { PrintScreen(); } } } #region[方法] //////截屏 /// private void PrintScreen() { string Opath = @"C:/Picture"; if (Opath.Substring(Opath.Length - 1, 1) != @"/") Opath = Opath + @"/"; string photoname = DateTime.Now.Ticks.ToString(); string path1 = Opath + DateTime.Now.ToShortDateString(); if (!Directory.Exists(path1)) Directory.CreateDirectory(path1); try { Screen scr = Screen.PrimaryScreen; Rectangle rc = scr.Bounds; int iWidth = rc.Width; int iHeight = rc.Height; Bitmap myImage = new Bitmap(iWidth, iHeight); Graphics gl = Graphics.FromImage(myImage); gl.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(iWidth, iHeight)); _img = myImage; //pictureBox1.Image = _img; // IntPtr dc1 = gl.GetHdc(); //gl.ReleaseHdc(dc1); MessageBox.Show(path1); MessageBox.Show(photoname); _img.Save(path1 + "//" + photoname + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg); // _img.Save("D:\1.jpeg"); SendFile(path1+"//"+photoname+".jpg"); } catch (Exception ex) { MessageBox.Show("截屏失败!n" + ex.Message.ToString() + "n" + ex.StackTrace.ToString()); } // MessageBox.Show("12322222"); ///////////////////////////////////////////////////////// ///////////////////发送图片流/////////////////////////// /* MemoryStream ms = new MemoryStream(); byte[] imagedata = null; _img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); imagedata = ms.GetBuffer(); byte[] arrFile = new byte[1024 * 1024 * 2]; //读取文件内容到字节数组,并 获得 实际文件大小 int length = ms.Read(arrFile, 0, arrFile.Length); // int length = ms.Read(arrFile, 0, arrFile.Length); //定义一个 新数组,长度为文件实际长度 +1 byte[] arrFileFina = new byte[length + 1]; arrFileFina[0] = 2;//设置 数据标识位等于1,代表 发送的是文件 //将 图片流数据数组 复制到 新数组中,下标从1开始 //arrFile.CopyTo(arrFileFina, 1); Buffer.BlockCopy(arrFile, 0, arrFileFina, 1, length); //发送文件数据 sokClient.Send(arrFileFina);//, 0, length + 1, SocketFlags.None); //MessageBox.Show("我在这里!!!"); // byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(_img); MessageBox.Show("2222"); */ } #endregion /* private void button1_Click(object sender, EventArgs e) { // this.WindowState = FormWindowState.Minimized; PrintScreen(); if (_img != null) { this.pictureBox1.Image = _img; } this.WindowState = FormWindowState.Normal; } */ ////// 闪屏 /// private void ShakeWindow() { Random ran = new Random(); //保存 窗体原坐标 System.Drawing.Point point = this.Location; for (int i = 0; i
上一篇: 二分查找法 C#实现
下一篇: C#创建ini文件、读取值、修改值