本文為系列最終篇,彙整開發視訊監控系統時常用的 C# WinForm 技術細節與可直接復用的程式碼片段,涵蓋非受控記憶體操作、INI 設定檔讀寫、硬體資訊取得、全螢幕切換、常用驗證等實戰技巧。
public byte[] ConvertToBytes(IntPtr dataBuf, int length)
{
byte[] byteBuf = new byte[length];
Marshal.Copy(dataBuf, byteBuf, 0, length);
return byteBuf;
}
public class IniFile
{
public string Path { get; set; }
[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);
public IniFile(string inipath) => Path = inipath;
public void IniWriteValue(string section, string key, string value)
=> WritePrivateProfileString(section, key, value, Path);
public string IniReadValue(string section, string key)
{
StringBuilder temp = new StringBuilder(5000);
GetPrivateProfileString(section, key, "", temp, 5000, Path);
return temp.ToString();
}
}
public static string GetNetCardMacAddress()
{
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
string mac = "";
foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"] == true)
mac = mo["MacAddress"].ToString();
}
return mac;
}
public static string GetBoardSN()
{
uint boardCount = HikVisionSDK.GetBoardCount();
StringBuilder sn = new StringBuilder();
for (uint i = 0; i < boardCount; i++)
{
DS_BOARD_DETAIL detail = new DS_BOARD_DETAIL();
HikVisionSDK.GetBoardDetail(i, ref detail);
for (int j = 0; j < 12; j++)
sn.Append((char)(detail.sn[j] + 0x30));
break; // 只取第一張卡
}
return sn.ToString();
}
private void FullScreen(ToolStripMenuItem menuItem, Panel videoPanel, int cs)
{
if (this.WindowState == FormWindowState.Maximized)
{
menuItem.Text = "全螢幕視窗";
this.FormBorderStyle = FormBorderStyle.FixedSingle;
this.WindowState = FormWindowState.Normal;
this.TopMost = false;
videoPanel.Width = pre_Width;
videoPanel.Height = pre_Height;
videoPanel.Top = pre_Top;
videoPanel.Left = pre_Left;
HideOtherControls(videoPanel, true);
minPanel(videoPanel, cs);
}
else
{
menuItem.Text = "關閉全螢幕";
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
this.TopMost = true;
pre_Width = videoPanel.Width;
pre_Height = videoPanel.Height;
pre_Top = videoPanel.Top;
pre_Left = videoPanel.Left;
videoPanel.Width = this.Width;
videoPanel.Height = this.Height;
videoPanel.Top = 0;
videoPanel.Left = 0;
HideOtherControls(videoPanel, false);
}
}
// IP 位址格式驗證
public bool IsIPAddress(string ip)
=> Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
// 無符號整數(正整數)驗證
public bool IsUInt(string value)
=> Regex.IsMatch(value, @"^\d*$");
實際開發中還會用到委派跨表單通訊、多畫面分割、事件處理等技巧,建議開發者根據專案需求靈活組合,善用搜尋引擎與官方文件快速解決問題。