开发者社区> 科技小先锋> 正文

C# 视频监控系列(15):总结贴——可能用到的C# WinForm技术小结

简介:
+关注继续查看

正文

     1.     IntPtr转换成byte[]

        public byte[] ConvertToBytes(IntPtr dataBuf, int length)
        {
            
byte[] byteBuf = new byte[length];
            Marshal.Copy(dataBuf, byteBuf, 
0, length);
            
return byteBuf;
        }

     2.     读写INI文件

          一般用于读写配置文件

    /// <summary>
    
/// 读写INI文件
    
/// </summary>
    public class IniFile
    {
        
/// <summary>
        
/// 文件INI名称
        
/// </summary>
        public string Path;

        
/// <summary>
        
/// 声明读写INI文件的API函数 
        
/// </summary>
        
/// <param name="section"></param>
        
/// <param name="key"></param>
        
/// <param name="val"></param>
        
/// <param name="filePath"></param>
        
/// <returns></returns>
        [DllImport("kernel32")]
        
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);


        [DllImport(
"kernel32")]
        
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);

        
/// <summary>
        
/// 类的构造函数,传递INI文件名
        
/// </summary>
        
/// <param name="inipath"></param>
        public IniFile(string inipath)
        {
            
//
            
// TODO: Add constructor logic here
            
//
            Path = inipath;
        }

        
/// <summary>
        
/// 写INI文件
        
/// </summary>
        
/// <param name="Section"></param>
        
/// <param name="Key"></param>
        
/// <param name="Value"></param>
        public void IniWriteValue(string Section, string Key, string Value)
        {
            WritePrivateProfileString(Section, Key, Value, 
this.Path);

        }

        
/// <summary>
        
/// 读取INI文件指定
        
/// </summary>
        
/// <param name="Section"></param>
        
/// <param name="Key"></param>
        
/// <returns></returns>
        public string IniReadValue(string Section, string Key)
        {
            StringBuilder temp 
= new StringBuilder(5000);
            
int i = GetPrivateProfileString(Section, Key, "", temp, 5000this.Path);
            
return temp.ToString();

        }
    }

     3.     获取网卡号

          可用于软件加密

        /// <summary>
        
/// 获得网卡号
        
/// </summary>
        
/// <returns></returns>
        public static string GetNetCardMacAddress()
        {
            ManagementClass mc 
= new ManagementClass("Win32_NetworkAdapterConfiguration");
            ManagementObjectCollection moc 
= mc.GetInstances();
            
string str = "";
            
foreach (ManagementObject mo in moc)
            {
                
if ((bool)mo["IPEnabled"== true)
                    str 
= mo["MacAddress"].ToString();
            }
            
return str;
        }

     4.     获取采集卡序列化

          可用于软件加密绑定,注意结构体DS_BOARD_DETAIL.sn是16位的,但是实际只有12位,VC++源码也只取了12位,后门都是0。

        /// <summary>
        
/// 获取板卡序号
        
/// </summary>
        
/// <returns></returns>
        public static string GetBoardSN()
        {
            
uint boardCount = HikVisionSDK.GetBoardCount();
            StringBuilder sn 
= new StringBuilder();
            
for (uint i = 0; i < boardCount; )
            {
                DS_BOARD_DETAIL boardDetail 
= new DS_BOARD_DETAIL();
                HikVisionSDK.GetBoardDetail(i, 
ref boardDetail);
                
for (int j = 0; j < 12; j++)
                {
                    sn.Append((
char)(boardDetail.sn[j] + 0x30));
                }
                
break;
            }
            
return sn.ToString();
        }

     5.     全屏显示视频窗口

        /// <summary>
        
/// 全屏
        
/// </summary>
        
/// <param name="tsmFullScreen">右键</param>
        
/// <param name="pVideo">显示视频的窗口</param>
        
/// <param name="cs">视频连接成功返回的值</param>
        private void FullScreen(ToolStripMenuItem tsmFullScreen, Panel pVideo, int cs)
        {
            
if (this.WindowState == System.Windows.Forms.FormWindowState.Maximized)
            {
                tsmFullScreen.Text 
= "全屏窗口";
                
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
                
this.WindowState = System.Windows.Forms.FormWindowState.Normal;
                
this.TopMost = false;
                pVideo.Width 
= pre_Width;
                pVideo.Height 
= pre_Height;
                pVideo.Top 
= pre_Top;
                pVideo.Left 
= pre_Left;

                
//隐藏其他控件
                HideOtherControls(pVideo, true);

                minPanel(pVideo, cs);
            }
            
else
            {
                tsmFullScreen.Text 
= "关闭全屏";
                
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
                
this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
                
this.TopMost = true;

                pre_Width 
= pVideo.Width;
                pre_Height 
= pVideo.Height;
                pre_Top 
= pVideo.Top;
                pre_Left 
= pVideo.Left;

                pVideo.Width 
= this.Width;
                pVideo.Height 
= this.Height;
                pVideo.Top 
= 0;
                pVideo.Left 
= 0;

                
//显示其他控件
                HideOtherControls(pVideo, false);
            }
        }

     6.     其他代码

        //判断是不是IP地址
        public bool IsIPAddress(string ip)
        {
            
return Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
        }
        
/// <summary>
        
/// 是否是无符号整数(正数)
        
/// </summary>
        
/// <param name="value"></param>
        
/// <returns></returns>
        public bool IsUInt(string value)
        {
            
return Regex.IsMatch(value, @"^\d*$");
        }

 

结束

     实际开发中远不只这么多,基本上也是有一个这样的功能需求就去GOOGLE一段代码出来,还有其他如delegate和event在窗体之间使用,分屏也是简单的采用了4个Panel,当放大时就分别隐藏其他Panel等等,就不一一列举了,多查查资料就行了: )     



本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586627,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java实现拼图小游戏(7)—— 计步功能及菜单业务的实现
注意由于我们计步功能的步数要在重写方法中用到,所以不能将初始化语句写在方法体内,而是要写在成员位置。在其名字的时候也要做到“见名知意”,所以我们给它起名字为step
70 0
Hunter狩猎者夹子机器人系统开发丨现成案例
区块链系统由无数节点构成,这些节点类似于一台tai.独立工作的计算机,当需要记账的时候,每一个节点都会参与竞争,系统会在一段时间内选出合适的节点来记账,而这个节点就会在数据区块中记录下近期发生的数据变化,记录完成后,节点就会把这个数据区块发送给其他节点,其他节点首先会核实数据,数据无误的话,就会把这个数据区块也放入自己的账本当中,于是系统里的所有节点都拥有一个完全一样的数据区块,即账本。 这种记账方式被称为区块链技术或者分布式总账技术
85 0
Qt Qwdget 汽车仪表知识点拆解4 另类进度条实现
先贴上效果图,注意,没有写逻辑,都是乱动的
40 0
Qt Qwdget 汽车仪表知识点拆解6 自定义控件
先贴上效果图,注意,没有写逻辑,都是乱动的
94 0
Qt编写安防视频监控系统12-异形布局
一、前言 视频监控系统中,除了常规的1画面、4画面、9画面、16画面以外,还有几个布局比较另类,比如6画面、8画面、13画面,有些通道需要占据不同的行列,4画面、9画面、16画面都是非常对称的布局,行数和列数都一样,而且每个通道占据的面积都一样,初学者都知道怎么处理。
1189 0
用MVVM模式开发中遇到的零散问题总结(4)——自制摄像头拍摄大头贴控件
原文:用MVVM模式开发中遇到的零散问题总结(4)——自制摄像头拍摄大头贴控件      一直有个疑问,为什么silverlight对摄像头支持这么好,WPF却一个库都没有....于是我各种苦恼啊,各种CodeProject啊,终于让我找到海外兄弟写的源码了,原理是通过不断向摄像头读取图片不断刷新到窗体控件上。
919 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
如何高效的制作主机次时代游戏——高效游戏制作流程
立即下载
Mock平台-让测试插上翅膀
立即下载
《前端代码是怎样智能生成的》
立即下载