using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using WinAPI; namespace QuickMsg { /// /// 消息客户端类 /// public class MsgClient { readonly CustomMsg MSG; /// /// 判断当前消息主服务器是否创建成功 /// public bool IsOk { get; private set; } /// /// 最后一次接收消息的时间,可用来判断服务端是否有响应 /// public DateTime Last_RecvTime { get; set; } = DateTime.Now.AddDays(-10); /// /// 主句柄 /// public IntPtr main_handle = IntPtr.Zero; /// /// 当收到消息时激发 /// public event CustomMsg.MsgEventHandler OnMsg; /// /// 连接上主服务器时触发 /// public event EventHandler OnConnected; /// /// 收到服务端关闭通知 /// public event EventHandler OnClose; /// /// 收到服务端关闭通知,即将关闭 /// public event CustomMsg.ClosingEventHandler OnClosing; /// /// 服务端大小改变时激发 /// public event CustomMsg.SizeEventHandler OnResize; private readonly string client_id=""; /// /// 实例化客户端 /// /// 服务端ID /// 当前客户端ID,会向服务器报告当前ID /// 客户端 public MsgClient(string main_id,string client_id, Form _form) { object mainHandle = RyMemoryShare.ReadFromMemory(1024, typeof(Int64), main_id); this.client_id = client_id; if (mainHandle == null) { IsOk = false; } else { main_handle = new IntPtr((Int64)mainHandle); MSG = new CustomMsg(_form);//创建消息通道 MSG.OnMsg += MSG_OnMsg; ryCommon.Storage Stor = new ryCommon.Storage(); Stor.SelectNodeBySet(); Stor.SetAttrValue("op", "connect"); Stor.SetAttrValue("clientid", client_id); MSG.Send(main_handle, MyDb.RyWin32.Sys_chanel_id, "xml" + Stor.XMLText);//向服务端发起连接请求 } } /// /// /// ~MsgClient() { DisConnect(); } /// /// 断开服务端连接 /// public void DisConnect() { if (IsOk) MSG.Send(main_handle, MyDb.RyWin32.Sys_chanel_id, "disconnect");//向服务端发起断开连接请求 IsOk = false; } /// /// 发送消息,采用多线程发送 /// /// /// public void Send(int wParam, string msg) { MSG.Send(main_handle, wParam, msg);//发送消息 } /// /// 向服务端发送心跳包 /// public void SendHeart() { MSG.Send2(main_handle, MyDb.RyWin32.Sys_chanel_id, "heart");//发送消息 } /// /// 判断服务端句柄是否存在。 /// /// public bool MainExist() { return User32.IsWindow(main_handle); } private void MSG_OnMsg(object sender, MsgArgs e) { Last_RecvTime = DateTime.Now; OnMsg?.Invoke(this,e); if (e.WParam == MyDb.RyWin32.Sys_chanel_id) //如果是系统通道请求 { switch (e.Msg_text) { case "connected"://与服务端连接成功 IsOk = true; OnConnected?.Invoke(this,new EventArgs()); break; case "close"://服务端关闭通知 IsOk = false; bool cancel = false; OnClosing?.Invoke(this,cancel); if (!cancel) { OnClose?.Invoke(this, new EventArgs()); } break; default: #region 如果是xml消息 if (e.Msg_text.StartsWith("xml")) { ryCommon.Storage Stor = new ryCommon.Storage(e.Msg_text.Substring(3)); Stor.SelectNodeBySet(); switch (Stor.GetAttrValue("op")) { case "resize"://服务端大小改变 OnResize?.Invoke(this, Stor.GetAttrValue("width", 0), Stor.GetAttrValue("height", 0)); break; } } break; #endregion } } } } }