前言
本章主要把可能用到的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等等,就不一一列举了,多查查资料就行了: )