⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 formaccess.cs

📁 kuiMsg是一款用.net C# 开发的即时消息开源软件,适合.net即时消息软件开发者用。 主要功能: 支持文件传输(p2p); 支持GIF动画表情( 彻底消除闪屏 :) );
💻 CS
📖 第 1 页 / 共 2 页
字号:
        /// 显示节点信息
        /// </summary>
        static  void SetTreeViewNodeShow()
        {
            int onlineUserCount = 0;
            int allUserCount = 0;
            int subDepCount = 0;
            exUser user;
            foreach (exDepartment dep in deps)
            {
                onlineUserCount = 0;
                allUserCount = 0;
                subDepCount = 0;

                foreach (TreeNode node in dep.Node.Nodes)
                {
                    if (node.Tag.ToString() != "1")
                        subDepCount++;
                    else
                    {
                        user = FormAccess.findUser(node.Name);
                        if (user != null && user.State != 0)
                            onlineUserCount++;
                        allUserCount++;
                    }
                }

                //if (allUserCount == 0)
                //    dep.Node.Text = dep.Node.ToolTipText.ToString() ;//+ "(" + subDepCount.ToString() + ")""(" + onlineUserCount.ToString() + "/" + allUserCount.ToString() + ")"+  + "";
                //else
                    dep.Node.Text = dep.Node.ToolTipText.ToString() + "(" + onlineUserCount.ToString() + "/" + allUserCount.ToString() + ")";
            }
        }
        #endregion

        #region 将所有用户的在线信息清除
        /// <summary>
        /// 将所有用户的在线信息清除
        /// </summary>
        public static void setUsersNoOnline()
        {
            FormAccess.selfInfo.State = 0;//将自己的状态设置为0设置为离线

            foreach (exUser user in FormAccess.Users)
            {
                user.State = 0;
                user.IP = System.Net.IPAddress.Parse("127.0.0.1");
                user.MTU = 750;
            }
        }
        #endregion

        #region 产生新发送消息窗口

        /// <summary>
        /// 产生新发送消息窗口
        /// </summary>
        /// <param name="userId">用户id</param>
        public static  Form  newSendMsgForm(string userId)
        {
            Form f = findForm (userId);
            if (f == null)
            {
                exUser user =  findUser(userId );
                if (user != null)
                {
                    f = new FormSendMsg();
                    f.Tag = userId;
                    f.Text = "与  " + user.userName + "(" + user.UserID + ")  对话";
                    sendMsgForms.add(f);
                }
            }
            f.Show();
            f.Activate();
            return f;
        }
        #endregion

        #region 发送消息到服务器sendMsgToServer
        /// <summary>
        /// 发送消息到服务器
        /// </summary>
        /// <param name="msgInfo">消息类型</param>
        /// <param name="msg">消息对象</param>
        public static void sendMsgToServer(Byte msgInfo, IMLibrary.ServerMsg msg)
        {
            byte[] compresseddata =  IMLibrary.Serializers.ObjToByte(msg);
            byte[] buf = new byte[compresseddata.Length + 2];
            buf[0] = 255;//合法用户标识
            buf[1] = msgInfo;//消息类型
            Buffer.BlockCopy(compresseddata, 0, buf, 2, compresseddata.Length);
            sockUDP.Send( ServerIP,  ServerPort, buf);
        }

        /// <summary>
        /// 发送消息到服务器
        /// </summary>
        /// <param name="msgInfo">消息类型</param>
        /// <param name="msg">消息对象</param>
        public static void sendMsgToServer(Byte msgInfo, IMLibrary.serverTransmitMsg  msg)
        {
            byte[] compresseddata = IMLibrary.Serializers.ObjToByte(msg);
            byte[] buf = new byte[compresseddata.Length + 2];
            buf[0] = 255;//合法用户标识
            buf[1] = msgInfo;//消息类型
            Buffer.BlockCopy(compresseddata, 0, buf, 2, compresseddata.Length);
            sockUDP.Send(ServerIP, ServerPort, buf);
        }

        /// <summary>
        /// 发送空数据给服务器实现UDP端口映射
        /// </summary>
        public static void sendMsgToServer()
        {
            byte[] buf = new byte[1];
            sockUDP.Send(ServerIP, ServerPort, buf);
        }

        #endregion

        #region  发送消息给一个用户sendMsgToOneUser
        /// <summary>
        /// 发送消息给一个用户
        /// </summary>
        /// <param name="msgInfo">消息类型</param>
        /// <param name="msg">消息对象</param>
        /// <param name="Ip">消息接收者IP地址</param>
        /// <param name="Port">消息接收者端口</param>
        public static void sendMsgToOneUser(Byte msgInfo,byte[] data, System.Net.IPAddress Ip, int Port)//发送消息到一个用户
        {
            byte[] buf = new byte[data.Length + 2];
            buf[0] = 255;//合法用户标识
            buf[1] = msgInfo;//消息类型
            Buffer.BlockCopy(data, 0, buf, 2, data.Length);

            sockUDP.Send(Ip, Port, buf);
        }

        /// <summary>
        /// 发送消息给一个用户
        /// </summary>
        /// <param name="msgInfo">消息类型</param>
        /// <param name="data">消息内容</param>
        /// <param name="Ip">接收者IP</param>
        /// <param name="Port">接收者端口</param>
        public static void sendMsgToOneUser(Byte msgInfo, byte[] data, exUser user)
        {
            byte[] buf = new byte[data.Length + 2];
            buf[0] = 255;//合法用户标识
            buf[1] = msgInfo;//消息类型
            Buffer.BlockCopy(data, 0, buf, 2, data.Length);

            if (user.isDirectCon)//如果直联,则消息直接发送
                sockUDP.Send(user.IP, user.Port, buf);
            else//否则消息由服务器转发
            {
                IMLibrary.serverTransmitMsg stMsg = new serverTransmitMsg(FormAccess.selfInfo.UserID, user.UserID, buf);
                sendMsgToServer(7, stMsg);
            }
        }

        /// <summary>
        /// 发送消息给一个用户
        /// </summary>
        /// <param name="msgInfo">消息类型</param>
        /// <param name="msg">消息对象</param>
        /// <param name="user">消息接收者</param>
        public static void sendMsgToOneUser(Byte msgInfo, IMLibrary.clientMsg msg,exUser user)
        {
            msg.sendUserId = selfInfo.UserID;//发送数据者为自己

            byte[] compresseddata = IMLibrary.Serializers.ObjToByte(msg);
            byte[] buf = new byte[compresseddata.Length + 2];
            buf[0] = 255;//合法用户标识
            buf[1] = msgInfo;//消息类型
            Buffer.BlockCopy(compresseddata, 0, buf, 2, compresseddata.Length);

            if (user.isDirectCon)//如果直联,则消息直接发送
                sockUDP.Send(user.IP, user.Port, buf);
            else//否则消息由服务器转发
            {
                IMLibrary.serverTransmitMsg stMsg = new serverTransmitMsg(FormAccess.selfInfo.UserID, user.UserID, buf);
                sendMsgToServer(7, stMsg);
            }
        }

        #endregion

        #region 慢速算法打UDP洞
        /// <summary>
        /// 慢速算法实现向在线用户打UDP洞
        /// </summary>
        /// <param name="isToAllUser">是否向所有用户打洞</param>
        /// <param name="User">如果是向一个用户打洞,则提供用户信息</param>
        public static void udpPenToUser(bool isToAllUser, exUser User)
        {
            //////向所有用户UDP打洞
            byte[] buf = IMLibrary.TextEncoder.textToBytes(FormAccess.selfInfo.UserID + "|");
            byte[] buf0 = new byte[800];
            byte[] buf1 = new byte[1200];
            byte[] buf2 = new byte[20000];
            byte[] buf3 = new byte[40000];

            Buffer.BlockCopy(buf, 0, buf0, 0, buf.Length);
            Buffer.BlockCopy(buf, 0, buf1, 0, buf.Length);
            Buffer.BlockCopy(buf, 0, buf2, 0, buf.Length);
            Buffer.BlockCopy(buf, 0, buf3, 0, buf.Length);

            if (isToAllUser)
                foreach (exUser user in FormAccess.Users)
                {
                    if (user.State == 0 || user.UserID==FormAccess.selfInfo.UserID ) return;//如果不在线或是自己就不打洞
                    FormAccess.sendMsgToOneUser(16, buf0, user.IP, user.Port);//向一个用户小包(网络非正常)UDP打洞
                    System.Threading.Thread.Sleep(10);
                    FormAccess.sendMsgToOneUser(16, buf1, user.IP, user.Port);//向一个用户中包(网络正常)UDP打洞
                    System.Threading.Thread.Sleep(10);
                    FormAccess.sendMsgToOneUser(16, buf2, user.IP, user.Port);//向一个用户大包(网络良好,处于局域网)UDP打洞
                    System.Threading.Thread.Sleep(10);
                    FormAccess.sendMsgToOneUser(16, buf3, user.IP, user.Port);//向一个用户大包(网络良好,处于局域网或本机)UDP打洞
                }
            else
            {
                if (User == null || User.UserID == FormAccess.selfInfo.UserID) return;
                FormAccess.sendMsgToOneUser(16, buf0, User.IP, User.Port);//向一个用户小包(网络非正常)UDP打洞
                System.Threading.Thread.Sleep(10);
                FormAccess.sendMsgToOneUser(16, buf1, User.IP, User.Port);//向一个用户中包(网络正常)UDP打洞
                System.Threading.Thread.Sleep(10);
                FormAccess.sendMsgToOneUser(16, buf2, User.IP, User.Port);//向一个用户大包(网络良好,处于局域网)UDP打洞
                System.Threading.Thread.Sleep(10);
                FormAccess.sendMsgToOneUser(16, buf3, User.IP, User.Port);//向一个用户大包(网络良好,处于局域网或本机)UDP打洞
            }
        }
        #endregion

        #region 给所有在线用户发送消息
        /// <summary>
        /// 给所有在线用户发送消息
        /// </summary>
        /// <param name="msgInfo">消息类型</param>
        /// <param name="msg">消息内容</param>
        public static void sendMsgToAllUser(Byte msgInfo, byte[] msg)
        {
            byte[] buf = new byte[msg.Length + 2];
            buf[0] = 255;//合法用户标识
            buf[1] = msgInfo;//消息类型
            Buffer.BlockCopy( msg, 0, buf, 2, msg.Length);

            foreach (exUser user in Users)
                if(user.State!=0)
                    sockUDP.Send(user.IP , user.Port , buf);
        }
        #endregion

        #region 给所有选中用户发送消息
        /// <summary>
        /// 给所有选中用户发送消息
        /// </summary>
        /// <param name="msgInfo">消息类型</param>
        /// <param name="msg">消息内容</param>
        public static void sendMsgToAllCheckUser(Byte msgInfo, byte[] msg)
        {
            byte[] buf = new byte[msg.Length + 2];
            buf[0] = 255;//合法用户标识
            buf[1] = msgInfo;//消息类型
            Buffer.BlockCopy(msg, 0, buf, 2, msg.Length);

            foreach (exUser user in Users)
                if (user.Node.Checked && user.State != 0)
                    sockUDP.Send(user.IP, user.Port, buf);
        }
        #endregion

        # region 打开公共窗口

        /// <summary>
        /// 打开公共窗口
        /// </summary>
        /// <param name="tag">公共窗口tag</param>
        public  static  Form  showPublicForm(string tag)
        {
            Form f = FormAccess.findForm(tag);
            if (f == null)
            {
                switch (tag)
                {
                    case "FormRecordMsgMisg":
                        f = new FormRecordMsgMisg();
                        break;
                    case "FormSendMsgGroup":
                        f = new FormSendMsgGroup();
                        break;
                    case "FormAppSet":
                        f = new FormAppSet();
                        break;
                    case "AboutBox":
                        f = new AboutBox();
                        break;

                }
                f.Tag = tag;
                FormAccess.sendMsgForms.add(f);
            }
            f.Show();
            f.Activate();
            return f;
        }

        #endregion

        #region 计算时间差
        /// <summary>
        /// 计算时间差
        /// </summary>
        /// <param name="DateTime1">开始时间</param>
        /// <param name="DateTime2">结束时间</param>
        /// <returns></returns>
        public  static int DateDiff(DateTime DateTime1, DateTime DateTime2)
        {
            int dateDiff = 0;
            try
            {
                TimeSpan ts1 = new TimeSpan(DateTime1.Ticks);
                TimeSpan ts2 = new TimeSpan(DateTime2.Ticks);
                dateDiff = ts2.Subtract(ts1).Seconds;
            }
            catch
            { }
            return dateDiff;
        }
        #endregion

        #region 播放声音
        /// <summary>
        /// 播放声音
        /// </summary>
        /// <param name="file">要播放的文件名及路径</param>
        public static void  palySound(string file)
        {
                IMLibrary.AV.SoundPlayer _palySound = new  IMLibrary.AV.SoundPlayer();
                _palySound.Play(file); 
        }

        public static void palySound(System.IO.Stream stream)
        {
            IMLibrary.AV.SoundPlayer _palySound = new IMLibrary.AV.SoundPlayer();
            _palySound.play(stream);
        }
        #endregion 

        #region 将程序添加到启动项
        /// <summary>
        /// 注册表操作,将程序添加到启动项
        /// </summary>
        public static void SetRegistryKey()
        {
            try
            {
                Microsoft.Win32.RegistryKey Reg;
                Reg = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", true);
                Reg.SetValue("LanMsg", Application.ExecutablePath);
            }
            catch { }
        }
        #endregion
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -