您的位置:首页 > 编程语言 > C#

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

2009-04-04 00:17 423 查看
前言

本章主要把可能用到的C# WinForm 功能性代码在这里汇总一下,以备实现其他功能来满足客户的其他需求,或者方便自己开发。

注意

本系列文章限于学习交流,注重过程,由于涉及公司,所以不提供源代码下载,非常抱歉!!但是请大家放心,核心、实现以及其他能够贴出来的代码我都会贴出来,并且争取尽所能的回答留言里的每一个问题,感谢大家关注,欢迎交流 :)

系列

1. C# 视频监控系列(1):准备

2. C# 视频监控系列(2):客户端——封装API

3. C# 视频监控系列(3):客户端——连接服务器

4. C# 视频监控系列(4):客户端——音频接收和抓图

5. C# 视频监控系列(5):客户端——给服务器端发送字符串和录像(数据捕获)

6. C# 视频监控系列(6):服务器端——封装API(上) [HikServer.dll]

7. C# 视频监控系列(7):服务器端——封装API(下) [DS40xxSDK.dll]

8. C# 视频监控系列(8):服务器端——预览和可被客户端连接

9. C# 视频监控系列(9):服务器端——数据捕获(抓图 + 录像)

10. C# 视频监控系列(10):服务器端——验证、设置画面质量、字幕叠加、板卡序列号

11. C# 视频监控系列(11):H264播放器——封装API[HikPlayM4.dll]

12. C# 视频监控系列(12):H264播放器——播放录像文件

13. C# 视频监控系列(13):H264播放器——控制播放和截图

14. C# 视频监控系列(14):总结贴——VC++代码转成C#小结

15. 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, 5000, this.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等等,就不一一列举了,多查查资料就行了: )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息