根据迁安深蓝技术公司(萤石云网站提供),定制开发的摄像头自动截图和ftp上传图片 
  
 
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;using Newtonsoft.Json.Linq;using System.Net;using System.Threading;using System.Configuration;using System.IO;using EnterpriseDT.Net.Ftp;namespace ys000{  public partial class PlayMainWindow : Form  {    #region 窗口初始化,参数对象初始化    int a = 0;//记录用户是否正在播放状态,0为未播放,1为正在播放    string jsonstr = "";//摄像头列表json    string cameraid = "";//摄像头id     string cameraid2 = "";//存放全屏播放的摄像头id    string statu = "";//摄像头是否加密,1为加密,0为未加密    int c = 1;//表示用户选择的是几个窗口播放,默认为1PictureBox[] picbox = new PictureBox[9];//创建对象数组,存放picbox对象,最多9画面,所以最多9个    private static IntPtr[] handle = new IntPtr[9];//存放播放句柄    private string[] cameraid1 = new string[9];//存放cameraid    IntPtr[] SessionId = new IntPtr[9];//存放申请的session    int j = 0;    int d = 0;    public PlayMainWindow()    {      InitializeComponent();      HkAction.MainForm = this;      try      {        HkAction.Start();//进入系统自动初始化库              }      catch (Exception ex)//出现异常则提示      {        MessageBox.Show("异常!"  ex.ToString(), "提示", MessageBoxButtons.OK);      }    }    #endregion    #region 开始播放9画面    private void Start_Play9()    {      SessionId[j] = HkAction.AllocSession();//每次点击存放session      if (SessionId[j] != null)//每次播放申请会话      {        bool[] play = new bool[9];        try        {          if (a == 0)          {            play[j] = HkAction.Play(handle[0], cameraid1[j], SessionId[j]);          }          else          {            switch (j)            {              case 0: play[j] = HkAction.Play(handle[0], cameraid1[j], SessionId[j]); break;//开始播放cameraid和handle一一对应case 1: play[j] = HkAction.Play(handle[1], cameraid1[j], SessionId[j]); break;              case 2: play[j] = HkAction.Play(handle[2], cameraid1[j], SessionId[j]); break;              case 3: play[j] = HkAction.Play(handle[3], cameraid1[j], SessionId[j]); break;              case 4: play[j] = HkAction.Play(handle[4], cameraid1[j], SessionId[j]); break;              case 5: play[j] = HkAction.Play(handle[5], cameraid1[j], SessionId[j]); break;              case 6: play[j] = HkAction.Play(handle[6], cameraid1[j], SessionId[j]); break;              case 7: play[j] = HkAction.Play(handle[7], cameraid1[j], SessionId[j]); break;              case 8: play[j] = HkAction.Play(handle[8], cameraid1[j], SessionId[j]); break;              default: break;            }          }        }        catch (Exception ex)        {          MessageBox.Show("异常:"  ex.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);        }      }      else      {        MessageBox.Show("申请会话异常!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);      }      a = 1;    }    #endregion    #region 开始播放4画面    private void Start_Play4()    {      SessionId[j] = HkAction.AllocSession();//每次点击存放session      if (SessionId[j] != null)//每次播放申请会话      {        bool[] play = new bool[4];        try        {          if (a == 0)          {            play[j] = HkAction.Play(handle[0], cameraid1[j], SessionId[j]);          }          else          {            switch (j)            {              case 0: play[j] = HkAction.Play(handle[0], cameraid1[j], SessionId[j]); break;//开始播放cameraid和handle一一对应case 1: play[j] = HkAction.Play(handle[1], cameraid1[j], SessionId[j]); break;              case 2: play[j] = HkAction.Play(handle[2], cameraid1[j], SessionId[j]); break;              case 3: play[j] = HkAction.Play(handle[3], cameraid1[j], SessionId[j]); break;              default: break;            }          }        }        catch (Exception ex)        {          MessageBox.Show("异常:"  ex.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);        }      }      else      {        MessageBox.Show("申请会话异常!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);      }      a = 1;    }    #endregion    #region 开始播放单画面    private void Start_Play1()    {      SessionId[j] = HkAction.AllocSession();//每次点击存放session      if (SessionId[j] != null)//每次播放申请会话      {        bool play;        try        {          play = HkAction.Play(handle[0], cameraid1[j], SessionId[j]);          if (play == true)          {            a = 1;          }        }        catch (Exception ex)        {          MessageBox.Show("异常:"  ex.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);        }      }      else      {        MessageBox.Show("申请会话异常!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);      }    }    #endregion    #region 用户选择保存截图路径    //选择保存路径    private string ShowSaveFileDialog(string time)    {      string path1 = "";      SaveFileDialog sfd = new SaveFileDialog();      sfd.RestoreDirectory = true;//保存对话框是否记忆上次打开的目录      if (sfd.ShowDialog() == DialogResult.OK)//点了保存按钮进入       {        path1 = sfd.FileName.ToString(); //获得文件路径         return path1;      }      else      {        return null;      }    }    #endregion    #region 截图按钮    //截图按钮    private void btnCapt_Click(object sender, EventArgs e)    {      string time = DateTime.Now.ToString("yyyyMMddHHmmss"); //取系统时间      if (a == 1)      {        string path1 = ShowSaveFileDialog(time);//获取用户选择路径        if (path1 == null)        {          MessageBox.Show("截图取消", "提示", MessageBoxButtons.OK);          return;        }        string path = path1  "-"  time  ".jpg";//保存路径和文件名(用户选择路径)        //string path = @"C:\Users\Administrator\Downloads\" time  ".jpg";//指定路径        if (HkAction.CapturePicture(path))//调用SDK截图方法        {          MessageBox.Show("截图成功,保存在:"  path, "提示", MessageBoxButtons.OK);        }        else        {          MessageBox.Show("截图失败", "提示", MessageBoxButtons.OK);        }      }      else      {        MessageBox.Show("请先点击“开始”按钮!", "提示", MessageBoxButtons.OK);      }    }    #endregion    #region 停止播放按钮    //停止播放按钮    private void btnStop_Click(object sender, EventArgs e)    {      for (int g = 0; g <= j; g )      {        HkAction.Stop(SessionId[g]);      }      Array.Clear(cameraid1, 0, cameraid1.Length);      Array.Clear(SessionId, 0, SessionId.Length);      Array.Clear(handle, 0, handle.Length);      Array.Clear(picbox, 0, picbox.Length);      createBox();      j = 0;      a = 0;    }    #endregion    #region 停止播放方法    private void stopPlay()    {      for (int g = 0; g <= j; g )      {        HkAction.Stop(SessionId[g]);      }      Array.Clear(cameraid1, 0, cameraid1.Length);      Array.Clear(SessionId, 0, SessionId.Length);      Array.Clear(handle, 0, handle.Length);      Array.Clear(picbox, 0, picbox.Length);      createBox();      j = 0;      a = 0;    }    #endregion    #region 登录按钮    //登录按钮    private void btnLogin_Click(object sender, EventArgs e)    {      try      {        if (HkAction.GetAccessToken() != null)        {          MessageBox.Show("用户登录成功!", "提示", MessageBoxButtons.OK);          label222.Text = "已登录";        }      }      catch (Exception ex)      {        MessageBox.Show("异常!"  ex.ToString(), "提示", MessageBoxButtons.OK);      }    }    #endregion    #region 退出系统    //退出系统    private void btnClose_Click(object sender, EventArgs e)    {      stopall();//停止播放            HkAction.Close();//反初始化库      if (ThreadGetImage != null)      {        ThreadGetImage.Abort();        ThreadGetImage = null;      }      this.Close();    }    #endregion    #region 设备列表按钮    private void btnGetlist_Click(object sender, EventArgs e)    {      this.flowLayoutPanel2.Controls.Clear();      try      {        string getList = HkAction.playList();        jsonstr = getList;        jsonHandle(jsonstr);      }      catch (Exception ex)//出现异常则提示      {        //MessageBox.Show("异常!"  ex.ToString(), "提示", MessageBoxButtons.OK);      }    }    #endregion    #region 构造实体类    public class json    {      public int resultCode { get; set; }      public int count { get; set; }      public List<cameraList> carameList { get; set; }    }    public class cameraList    {      public string cameraId { get; set; }      public string cameraName { get; set; }      public int cameraNo { get; set; }      public int defence { get; set; }      public string deviceId { get; set; }      public string deviceName { get; set; }      public int deviceSerial { get; set; }      public int isEncrypt { get; set; }      public int isShared { get; set; }      public string picUrl { get; set; }      public int status { get; set; }      public int videoLevel { get; set; }    }    public class frm//窗体实体类,用来保存全局变量,并在静态方法中调用    {      public int a { get; set; }//记录用户点击的是第几个摄像头      public int b { get; set; }//记录用户是否正在播放状态,0为未播放,1为正在播放      public int c { get; set; }//表示用户选择的是几个窗口播放,默认为1      public string jsonstr { get; set; }//摄像头列表json      public string cameraid { get; set; }//摄像头id          public string safeKey { get; set; }//摄像头密码,默认ABCDEF        }    public static JObject jObjInfo { get; set; }    public static int isOpertion { get; set; }//0未执行  1正在执行 2已经执行    public static MessageType mType { get; set; }    public enum MessageType    {      INS_PLAY_EXCEPTION = 0,  // 播放异常,通常是设备断线或网络异常造成      INS_PLAY_RECONNECT = 1,  // 重连,实时流播放时内部会自动重连      INS_PLAY_RECONNECT_EXCEPTION = 2,  // 重连异常      INS_PLAY_START = 3,  // 播放开始      INS_PLAY_STOP = 4,  // 播放终止      INS_PLAY_ARCHIVE_END = 5,  // 播放结束,回放结束时会有此消息      INS_RECORD_FILE = 20, // 查询的录像文件(录像搜索结果)      INS_RECORD_SEARCH_END = 21, // 录像查询结束(暂不使用)      INS_RECORD_SEARCH_FAILED = 22, // 录像查询失败    }    #endregion    #region 处理json方法,获取设备列表以缩略图显示并显示摄像头一些信息    public void jsonHandle(string str)    {      string jsonStr = str;      JObject jsonObj = JObject.Parse(jsonStr);      JArray jar = JArray.Parse(jsonObj["cameraList"].ToString());      int a = Int32.Parse(jsonObj["count"].ToString());      for (int m = 0; m < a; m )      {        JObject j = JObject.Parse(jar[m].ToString());//取第几个摄像头信息放入对象j        string picurl = j["picUrl"].ToString();//取出缩略图url         Label label1 = new Label();        label1.Text = j["cameraName"].ToString();//取出摄像头名字        Label label2 = new Label();        string isEncrypt = j["isEncrypt"].ToString();//取出摄像头状态        if (isEncrypt == "0")        {          label2.Text = "加密状态:未加密";//把摄像头加密状态给label        }        else if (isEncrypt == "1")        {          label2.Text = "加密状态:已加密";//把摄像头加密状态给label        }        string status = j["status"].ToString();        Label label3 = new Label();        if (status == "0")        {          label3.Text = "状态:离线";//把摄像头状态给label        }        else        {          label3.Text = "状态:在线";//把摄像头状态给label        }        PictureBox picbox = new PictureBox();        picbox.Size = new Size(120, 120);        picbox.Name = picbox  m.ToString();//根据i值来取名        picbox.BackgroundImage = Image.FromStream(WebRequest.Create(picurl).GetResponse().GetResponseStream());//取网络图片        picbox.BackgroundImageLayout = ImageLayout.Stretch;//背景图自适应控件大小        this.flowLayoutPanel2.Controls.Add(picbox);//添加控件picturebox        this.flowLayoutPanel2.Controls.Add(label1);//添加控件label        this.flowLayoutPanel2.Controls.Add(label2);//添加控件label        this.flowLayoutPanel2.Controls.Add(label3);//添加控件label        picbox.MouseClick = new MouseEventHandler(picbox_MouseClick);//添加鼠标点击事件,方便后面确定点击的是哪个摄像头picbox.MouseHover = new System.EventHandler(picbox_MouseHover);        picbox.MouseLeave = new System.EventHandler(picbox_MouseLeave);        //picbox.SizeModeChanged = new System.EventHandler(picbox_SizeModeChanged);              }      foreach (Control c in flowLayoutPanel2.Controls)        c.Margin = new Padding(5);    }    #endregion    #region 处理json方法重载(无参数),获取用户摄像头总数    public int jsonHandle()    {      JObject jsonObj = JObject.Parse(jsonstr);      JArray jar = JArray.Parse(jsonObj["cameraList"].ToString());      int a = Int32.Parse(jsonObj["count"].ToString());      return a;    }    #endregion    #region 处理json方法重载( 1),获取用户摄像头id    public string jsonHandle(int n)    {      JObject jsonObj = JObject.Parse(jsonstr);      JArray jar = JArray.Parse(jsonObj["cameraList"].ToString());      JObject j = JObject.Parse(jar[n].ToString());//取第几个摄像头信息放入对象j      cameraid = j["cameraId"].ToString();//取出      //  Local_sessionid      //     //通讯会话      //string Local_sessionid = "";      //摄像头ID      string Local_Cameraid = cameraid;      //摄像头通道号      Local_cameraNO = Convert.ToInt32(j["cameraNo"].ToString().Trim());      return cameraid;    }    #endregion    #region 处理json方法重载( 2),获取用户摄像头加密状态    public string jsonHandle1(int n)    {      JObject jsonObj = JObject.Parse(jsonstr);      JArray jar = JArray.Parse(jsonObj["cameraList"].ToString());      JObject j = JObject.Parse(jar[n].ToString());//取第几个摄像头信息放入对象j      statu = j["isEncrypt"].ToString();//取出      return statu;    }    #endregion    #region 单击该缩略图获取摄像头ID并播放    private void picbox_MouseClick(object sender, MouseEventArgs e)    {      PictureBox picb1 = sender as PictureBox;//取出点击的控件sender      string name = "";      if (picb1 != null)//点击则非空,否则为空      {        name = picb1.Name.Substring(picb1.Name.Length - 1, 1); //取名字中最后一个字,它正好是控件的index      }      int n = Int32.Parse(name);//string 转换int      cameraid = jsonHandle(n);//取出该摄像头id      if (a == 1 && c != 1)      {        for (int t = 0; t < 9; t )        {          if (cameraid == cameraid1[t])//检查视频是否已在播放中          {            MessageBox.Show("该视频已经在播放中,请勿重复点击!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);            return;          }        }      }      cameraid1[j] = cameraid;      statu = jsonHandle1(n);      if (statu == "1")//视频已加密,需要调用萤石接口发送短信验证码      {        MessageBox.Show("该视频已加密,暂时不能播放!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);        //return;      }      else//status=="1"即未加密      {        Local_sessionid = SessionId[j].ToString();        if (c == 1)//单画面        {          handle[0] = picbox[0].Handle;          if (a == 1)          {            bool close = HkAction.Stop(SessionId[j]);          }          Start_Play1();          j = 0;        }        else if (c == 4)//4画面        {          handle[j] = picbox[j].Handle;          if (a == 1 && d == 1)          {            bool close = HkAction.Stop(SessionId[j]);          }          Start_Play4();          if (j < 3)          {            j ;          }          else if (j == 3)          {            j = 0;            d = 1;          }        }        else if (c == 9)//9画面        {          //picbox[j].Image = Image.FromFile("60.gif");//未成功播放前显示加载动态图          //picbox[j].SizeMode = PictureBoxSizeMode.CenterImage;//图片居中          handle[j] = picbox[j].Handle;//赋予句柄          if (a == 1 && d == 1)//全部容器都在播放          {            bool close = HkAction.Stop(SessionId[j]);//关闭最开始打开的画面          }          Start_Play9();          if (j < 8)          {            j ;          }          else if (j == 8)          {            j = 0;            d = 1;          }        }      }    }    #endregion    private static string AppKey = ConfigurationManager.AppSettings["AppKey"].ToString();    private static string SecretKey = ConfigurationManager.AppSettings["SecretKey"].ToString();    public bool BeginFlag = true;    public string local_loginPath = Application.StartupPath  "\\LOG\\";    #region 加载窗体时显示单画面    private void Form1_Load(object sender, EventArgs e)    {      createBox();//初始化画面即创建容器根据C的值      this.lbl_appkey.Text = AppKey;//appkey      this.lbl_Secret.Text = SecretKey;//secretkey      //stsTime.Text = DateTime.Now.ToString("yyyy年 MM月 dd日 ")  DateTime.Now.ToShortTimeString();      UserControl.CheckForIllegalCrossThreadCalls = false;      if (!Directory.Exists(Application.StartupPath  "\\Configs\\"))      {        Directory.CreateDirectory(Application.StartupPath  "\\Configs\\");      }      if (!Directory.Exists(local_loginPath))      {        Directory.CreateDirectory(local_loginPath);      }      #region 常规配置      if (!File.Exists(Application.StartupPath  "\\Configs\\Config.ini"))      {        File.WriteAllText(Application.StartupPath  "\\Configs\\Config.ini", @"D:\d\,60,false", Encoding.Default);      }      string AlltextConfig = File.ReadAllText(Application.StartupPath  "\\Configs\\Config.ini", Encoding.Default);      string[] configArray = AlltextConfig.Split(',');      String SaveDir = configArray[0];      int TimeMinute = 0;      try      {        TimeMinute = Convert.ToInt32(configArray[1]);      }      catch      {        TimeMinute = 60;      }      this.timer1.Interval = TimeMinute * 60 * 1000;      this.timer1.Start();      try      {        this.txt_ImageSaveDir.Text = configArray[0];      }      catch      {      }      try      {        this.txt_minute.Text = configArray[1];      }      catch      {      }      try      {        if (configArray[2].Trim() == "true")        {          ck_ClearMoreFile.Checked = true;        }        else        {          ck_ClearMoreFile.Checked = false;        }      }      catch      {      }      #endregion      #region ftp配置      try      {        if (!File.Exists(Application.StartupPath  "\\Configs\\Config.ini"))        {          File.WriteAllText(Application.StartupPath  "\\Configs\\Config_FTP.ini", "127.0.0.1,21,ruanjian,ruanjian,true,false", Encoding.Default);        }        string innerFtpData = File.ReadAllText(Application.StartupPath  "\\Configs\\Config_FTP.ini", Encoding.Default);        string[] arrayFtp = innerFtpData.Split(',');        txtFTPIP.Text = arrayFtp[0];        txtFTPPort.Text = arrayFtp[1];        txtFTPUserName.Text = arrayFtp[2];        txtFTPUserPass.Text = arrayFtp[3];        if (arrayFtp[4] == "true")        {          cl_FTPClearFile.Checked = true;        }        else        {          cl_FTPClearFile.Checked = false;        }        if (arrayFtp[5] == "true")        {          rdbFTPStart.Checked = true;        }        else        {          rdbFTPStop.Checked = true;        }      }      catch      {      }      #endregion      if (rdbFTPStart.Checked)      {        this.Timer_FTP.Start();      }      //解析站点配置      if (!File.Exists(Application.StartupPath  "\\Configs\\Config_StationList.ini"))      {        string InnserConfig = "//双斜线注释不再存储该站图片\r\nXXX-XXX\r\nnXXX-nXXX\r\nnXXX-nXXX\r\nXXX(nXXX)";        File.WriteAllText(Application.StartupPath  "\\Configs\\Config_StationList.ini", InnserConfig, Encoding.Default);      }      string InnerStationList = txt_StationList.Text;      string[] FilesLine = File.ReadAllLines(Application.StartupPath  "\\Configs\\Config_StationList.ini", Encoding.Default);      StringBuilder sbtext = new StringBuilder();      foreach (var item in FilesLine)      {        if (!item.Contains("//"))        {          if (item.Contains("-"))          {            string[] le = item.Split('-');            if (Dic_Local.ContainsKey(le[1].Trim()))            {              Dic_Local[le[1].Trim()] = le[0].Trim();            }            else            {              Dic_Local.Add(le[1].Trim(), le[0].Trim());            }          }        }        sbtext.Append(item.Trim()  "\r\n");      }      this.txt_StationList.Text = sbtext.ToString();    }    #endregion    Dictionary<string, string> Dic_Local = new Dictionary<string, string>();    #region 单画面显示按钮    private void btnFrm1_Click(object sender, EventArgs e)    {      c = 1;      btnStop_Click(sender, e);    }    #endregion    #region 四画面显示按钮    private void btnFrm4_Click(object sender, EventArgs e)    {      c = 4;      btnStop_Click(sender, e);    }    #endregion    #region 九画面显示按钮    private void btnFrm9_Click(object sender, EventArgs e)    {      c = 9;      btnStop_Click(sender, e);    }    #endregion    #region 创建播放容器并添加双击事件    private void createBox()    {      this.flowLayoutPanel1.Controls.Clear();//清楚所有容器      if (c == 1)//单画面只需创建一个容器即可      {        PictureBox pic = new PictureBox();        pic.Size = new Size(955, 668);//指定播放容器大小        pic.BackColor = Color.Black;        pic.Name = "picBox0";        this.flowLayoutPanel1.Controls.Add(pic);//创建播放容器         picbox[0] = pic;        handle[0] = picbox[0].Handle;        picbox[0].MouseDoubleClick = new MouseEventHandler(picbox_MouseDoubleClick);//添加鼠标双击击事件,用于全屏播放      }      else//多画面时根据C的值创建容器      {        for (int i = 0; i < c; i )        {          PictureBox pic = new PictureBox();          if (c == 4)          {            pic.Size = new Size(470, 330);//指定播放容器大小4画面          }          else          {            pic.Size = new Size(312, 218);//指定播放容器大小9画面          }          pic.BackColor = Color.Black;          pic.Name = "picBox"  i.ToString();          this.flowLayoutPanel1.Controls.Add(pic);//创建播放容器           picbox[i] = pic;          handle[i] = picbox[i].Handle;          pic.Margin = new System.Windows.Forms.Padding(1);          picbox[i].MouseDoubleClick = new MouseEventHandler(picbox_MouseDoubleClick);        }      }    }    #endregion    #region 双击跳转到全屏显示窗口    private void picbox_MouseDoubleClick(object sender, EventArgs e)    {      if (cameraid2 == "")      {        PictureBox picb1 = sender as PictureBox;//取出点击的控件sender        int n = 0;        if (picb1 != null)//点击则非空,否则为空        {          n = Int32.Parse(picb1.Name.Substring(picb1.Name.Length - 1, 1)); //取名字中最后一个字,它正好是控件的index        }        cameraid2 = cameraid1[n];        if (c == 1)        {          bool close = HkAction.Stop(SessionId[0]);//关闭当前所有正在播放的该摄像头        }        else        {          stopall();        }        FullScreenWindow frm = new FullScreenWindow(cameraid2, SessionId[n]);        //定义一个委托,在frm关闭时执行委托函数内容        frm.FormClosed = delegate(object s, FormClosedEventArgs fe)        {          if (c == 1) { HkAction.Play(handle[0], cameraid1[0], SessionId[0]); cameraid2 = ""; }          else          {            startall(); cameraid2 = "";          }        };        frm.Show();      }      else      {        MessageBox.Show("此视频已在全屏播放中,请不要重复点击!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);      }    }    #endregion    #region 鼠标停在摄像头缩略图上显示播放图标    private void picbox_MouseHover(object sender, EventArgs e)    {      PictureBox picb1 = sender as PictureBox;//取出点击的控件sender            if (picb1 != null)//点击则非空,否则为空      {        picb1.Image = Image.FromFile("2.png");        picb1.SizeMode = PictureBoxSizeMode.CenterImage;      }    }    #endregion    #region 鼠标离开时清除播放图片,重新显示缩略图    private void picbox_MouseLeave(object sender, EventArgs e)    {      PictureBox picb1 = sender as PictureBox;//取出点击的控件sender            if (picb1 != null)//点击则非空,否则为空      {        picb1.Image = null;      }    }    #endregion    #region 鼠标滚动方法    private void Form_MouseWheel(object sender, MouseEventArgs e)    {      //获取光标位置      Point mousePoint = new Point(e.X, e.Y);      //换算成相对本窗体的位置      mousePoint.Offset(this.Location.X, this.Location.Y);      //判断是否在flowLayoutPanel2内      if (flowLayoutPanel2.RectangleToScreen(       flowLayoutPanel2.DisplayRectangle).Contains(mousePoint))      {        //滚动        flowLayoutPanel2.AutoScrollPosition = new Point(0, flowLayoutPanel2.VerticalScroll.Value - e.Delta);      }    }    #endregion    #region 鼠标滚动事件    private void flowLayoutPanel2_MouseHover(object sender, EventArgs e)    {      this.MouseWheel = new MouseEventHandler(Form_MouseWheel);    }    #endregion    #region 停止所有当前播放    private void stopall()    {      for (int s = 0; s < j; s )      {        try        {          HkAction.Stop(SessionId[s]);        }        catch (Exception ex)        {          //MessageBox.Show("异常"  ex.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);        }      }      a = 0;    }    #endregion    #region 开始所有当前播放    private void startall()    {      try      {        for (int s = 0; s < j; s )        {          HkAction.Play(handle[s], cameraid1[s], SessionId[s]);        }      }      catch (Exception ex)      {        //MessageBox.Show("异常"  ex.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);      }      a = 1;    }    #endregion    #region 刷新按钮    private void btnRefresh_Click(object sender, EventArgs e)    {      stopall();      createBox();      startall();    }    #endregion    /// <summary>    /// 测试流程    /// </summary>    /// <param name="sender"></param>    /// <param name="e"></param>    private void btn_liucheng_Click(object sender, EventArgs e)    {      if (ThreadGetImage != null)      {        ThreadGetImage.Abort();        ThreadGetImage = null;      }      ThreadGetImage = new Thread(GetImageFun);      ThreadGetImage.Start();    }    Thread ThreadGetImage = null;    public void GetImageFun()    {      try      {        //登录         if (HkAction.GetAccessToken() != null)        {          Console.WriteLine("登录成功");          //this.Text = "登陆成功!";          //获取摄像头列表          string getList = HkAction.playList();          jsonstr = getList;          jsonHandleMy(jsonstr);        }      }      catch (Exception ex)//出现异常则提示      {        //MessageBox.Show("异常!"  ex.ToString(), "提示", MessageBoxButtons.OK);      }      //测试不用显示截图     }    int totalNum = 0;    //处理json方法,获取设备列表以缩略图显示并显示摄像头一些信息    public void jsonHandleMy(string str)    {      try      {        string jsonStr = str;        JObject jsonObj = JObject.Parse(jsonStr);        JArray jar = JArray.Parse(jsonObj["cameraList"].ToString());        int a = Int32.Parse(jsonObj["count"].ToString());        totalNum = a;        StringBuilder ShexiangTouListSb = new StringBuilder();        ShexiangTouListSb.Append("更新时间:"  System.DateTime.Now.ToString()  "\r\n");        for (int cc = 0; cc < totalNum; cc )        {          JObject j = JObject.Parse(jar[cc].ToString());//取第几个摄像头信息放入对象j          string LblName = j["cameraName"].ToString();//取出摄像头名字          //if (LblName.Contains("("))          //{          //  LblName = LblName.Split('(')[1].Replace(")", "").Trim();          //}          string isEncrypt = j["isEncrypt"].ToString();//取出摄像头状态           string JiamiState = "未加密";          if (isEncrypt == "0")          {            JiamiState = "未加密";//把摄像头加密状态给label          }          else if (isEncrypt == "1")          {            JiamiState = "已加密";//把摄像头加密状态给label          }          string status = j["status"].ToString();          string deviceSerialA = j["deviceSerial"].ToString();//取出摄像头驱动编号           string zaixianzhuangtai = "离线";          if (!Dic_Local.ContainsKey(deviceSerialA.ToString().Trim()))          {            zaixianzhuangtai = "未获取";//把摄像头状态给label            if (status != "0")            {              zaixianzhuangtai = "在线(未配置获取)";            }            else            {              zaixianzhuangtai = "离线(未配置获取)";            }          }          else          {            if (status == "0")            {              zaixianzhuangtai = "离线";//把摄像头状态给label             }            else            {              zaixianzhuangtai = "在线";//把摄像头状态给label            }          }          ShexiangTouListSb.Append(LblName  "-"  zaixianzhuangtai  "-"  JiamiState  "\r\n");        }        this.txt_allstate.Text = ShexiangTouListSb.ToString();        for (int m = 0; m < totalNum; m )        {          JObject j = JObject.Parse(jar[m].ToString());//取第几个摄像头信息放入对象j           string status = j["status"].ToString();          string LblName = j["cameraName"].ToString();//取出摄像头名字          if (LblName.Contains("("))//中文名          {            LblName = LblName.Split('(')[0].Replace("(", "").Trim();//括号内部分          }          string deviceSerial = j["deviceSerial"].ToString();//取出摄像头驱动编号           if (status != "0" && Dic_Local.ContainsKey(deviceSerial.Trim()))//在线的时候截缩略图  并且 驱动编号存在于存储列表内          {            DateTime dtNow = System.DateTime.Now;//.ToString("yyyy-MM-dd");             string SaveFileName = System.DateTime.Now.ToString("yyyy_MM_dd_HH_mm")  ".jpg";            string Path = txt_ImageSaveDir.Text.Trim()  "\\"; // Application.StartupPath  "\\ImageSave\\";            if (!System.IO.Directory.Exists(Path))            {              System.IO.Directory.CreateDirectory(Path);            }            if (!Directory.Exists(Path  deviceSerial  "\\"))            {              Directory.CreateDirectory(Path  deviceSerial  "\\");            }            string DIrDirInner = dtNow.ToString("yyyy-MM-dd");            if (!Directory.Exists(Path  deviceSerial  "\\"  DIrDirInner  "\\"))//存储目录 摄像头编号 日期 文件夹形式            {              Directory.CreateDirectory(Path  deviceSerial  "\\"  DIrDirInner  "\\");            }            string CurrentCameraID = j["cameraId"].ToString();            //获取会话开始播放            IntPtr CurrentSessionId = HkAction.AllocSession();//每次点击存放session             if (CurrentSessionId != null)//每次播放申请会话            {              bool play;              try              { play = HkAction.Play(this.pictureBox1.Handle, CurrentCameraID, CurrentSessionId); if (play == true) {   try   {     #region 只存储最新数据 剩下的都删除     try     {       if (this.ck_ClearMoreFile.Checked)//目录下不存储任何历史文件 只存储最新的一条文件       {         //string FileDirsCurrentLocalOp = Path  deviceSerial  "\\"  DIrDirInner  "\\";         DirectoryInfo root = new DirectoryInfo(Path  deviceSerial  "\\");         DirectoryInfo[] Dirs = root.GetDirectories();//日期文件夹目录          foreach (DirectoryInfo item in Dirs)//循环时间目录         {           foreach (FileInfo f in item.GetFiles())//循环删除时间目录下的图形文件           {             string name = f.Name;             string fullName = f.FullName;             File.Delete(fullName);           }//end foreach          }       }//end if (this.ck_ClearMoreFile.Checked)     }     catch     {     }     #endregion     System.Threading.Thread.Sleep(5000);//线程5s截图     //"\\"  DIrDirInner  "\\"     string CurrentLastSavePath = Path  deviceSerial  "\\"  DIrDirInner  "\\"  SaveFileName;//带日期目录     if (HkAction.CapturePictureMy(CurrentSessionId, CurrentLastSavePath))//调用SDK截图方法     {       txt_log.Text = System.DateTime.Now  ":"  LblName  "("  deviceSerial  ")"  "存储成功!\r\n";     }     System.Threading.Thread.Sleep(5000);//下一组截图准备   }   catch (Exception ex)   {     txt_log.Text = System.DateTime.Now  ":"  LblName  "("  deviceSerial  ")"  ex.Message  "\r\n";   }   ///停止播放   HkAction.Stop(CurrentSessionId);   HkSDK.OpenSDK_FreeSession(CurrentSessionId.ToString());   //MessageBox.Show(CurrentSessionId  "  清空   "  LblName); }              }              catch (Exception ex)              { txt_log.Text = System.DateTime.Now  ":"  LblName  "("  deviceSerial  ")"  "异常"  ex.Message  "\r\n";              }            }            else            {              //MessageBox.Show("申请会话异常!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);              txt_log.Text = System.DateTime.Now  ":"  LblName  "("  deviceSerial  ")"  "申请会话异常"  "\r\n";            }          }          else//不在线          {            string txtLeng = "设备离线";            if (!Dic_Local.ContainsKey(deviceSerial.Trim()))            {              txtLeng = "未配置获取";            }            else            {              txtLeng = "设备离线";            }            //存储日志            txt_log.Text = System.DateTime.Now  ":"  LblName  "("  deviceSerial  ")"  txtLeng  "\r\n";          }        }      }      catch (Exception ex)      {        Console.WriteLine(ex.Message);        Console.WriteLine(ex.StackTrace);      }      //foreach (Control c in flowLayoutPanel2.Controls)      //  c.Margin = new Padding(5);    }    /// <summary>    /// 选择存储路径    /// </summary>    /// <param name="sender"></param>    /// <param name="e"></param>    private void btn_search_Click(object sender, EventArgs e)    {      FolderBrowserDialog dialog = new FolderBrowserDialog();      dialog.Description = "请选择图像文件存储路径(路径中不要包含中文字符!!!)";      DialogResult result = dialog.ShowDialog();      if (result == System.Windows.Forms.DialogResult.Cancel)      {        return;      }      string folderPath = dialog.SelectedPath.Trim();      this.txt_ImageSaveDir.Text = folderPath;      DirectoryInfo theFolder = new DirectoryInfo(folderPath);      if (theFolder.Exists)      {        //操作        return;      }    }    /// <summary>    /// 保存配置文件    /// </summary>    /// <param name="sender"></param>    /// <param name="e"></param>    private void btn_SaveDir_Click(object sender, EventArgs e)    {      try      {        if (!Directory.Exists(Application.StartupPath  "\\Configs\\"))        {          Directory.CreateDirectory(Application.StartupPath  "\\Configs\\");        }        #region 常规配置        try        {          //图片存储路径   if (!Directory.Exists(this.txt_ImageSaveDir.Text.Trim()))          {            Directory.CreateDirectory(this.txt_ImageSaveDir.Text.Trim());          }          //上传间隔          int minute = 60;          try          {            minute = Convert.ToInt32(txt_minute.Text.Trim());          }          catch          {            minute = 60;          }          string clearMoreFile = ck_ClearMoreFile.Checked ? "true" : "false";          string InnerConfigContent = this.txt_ImageSaveDir.Text.Trim()  ","  minute.ToString().Trim()  ","  clearMoreFile;//目录,下载间隔,是否清除历史文件 true-清除  false-不清除           File.WriteAllText(Application.StartupPath  "\\Configs\\Config.ini", InnerConfigContent, Encoding.Default);        }        catch (Exception ex)        {        }        #endregion        #region FTP配置        try        {          string IP = txtFTPIP.Text;          string Port = txtFTPPort.Text;          string UserName = txtFTPUserName.Text;          string UserPass = txtFTPUserPass.Text;          string FtpClear_check = cl_FTPClearFile.Checked ? "true" : "false";          string rdbFTPStarta = rdbFTPStart.Checked ? "true" : "false";          string FtpConfigStr = IP  ","  Port  ","  UserName  ","  UserPass  ","  FtpClear_check  ","  rdbFTPStarta;          File.WriteAllText(Application.StartupPath  "\\Configs\\Config_FTP.ini", FtpConfigStr, Encoding.Default);        }        catch        {        }        #endregion        #region        try        {          string InnerStationList = txt_StationList.Text;          File.WriteAllText(Application.StartupPath  "\\Configs\\Config_StationList.ini", InnerStationList, Encoding.Default);        }        catch        {        }        #endregion        MessageBox.Show("保存配置成功!重启软件以使配置生效!");      }      catch      {        MessageBox.Show("保存配置失败!");      }    }    /// <summary>    /// 时间运行控件    /// </summary>    /// <param name="sender"></param>    /// <param name="e"></param>    private void timer1_Tick(object sender, EventArgs e)    {      if (ThreadGetImage != null)      {        ThreadGetImage.Abort();        ThreadGetImage = null;      }      ThreadGetImage = new Thread(GetImageFun);      ThreadGetImage.Start();    }    //关闭窗口得时候实现    private void PlayMainWindow_FormClosing(object sender, FormClosingEventArgs e)    {      try      {        stopall();//停止播放              HkAction.Close();//反初始化库      }      catch (Exception ex)      {        Console.WriteLine(ex.Message);      }      if (ThreadGetImage != null)      {        ThreadGetImage.Abort();        ThreadGetImage = null;      }    }    //ftp上传组件    private void Timer_FTP_Tick(object sender, EventArgs e)    {      try      {        if (System.DateTime.Now.Hour == 12 && System.DateTime.Now.Minute == 0)        {          string CurrentText = this.txt_log.Text;          this.txt_log.Text = "";          string dir = local_loginPath  "Alltimes\\";          if (!Directory.Exists(dir))          {            Directory.CreateDirectory(dir);          }          File.AppendAllText(dir  System.DateTime.Now.ToString("yyyyMMdd")  ".txt", CurrentText, Encoding.Default);        }        if (Thread_FtpUp != null)        {          Thread_FtpUp.Abort();          Thread_FtpUp = null;        }        Thread_FtpUp = new Thread(FtpUp);        Thread_FtpUp.Start();      }      catch      {      }    }    public Thread Thread_FtpUp = null;    /// <summary>    /// FTP    /// </summary>    EnterpriseDT.Net.Ftp.FTPClient FTP = new EnterpriseDT.Net.Ftp.FTPClient();    /// <summary>    /// FTP上传    /// </summary>    private void FtpUp()    {      try      {        FTP = new FTPClient(this.txtFTPIP.Text.Trim(), int.Parse(this.txtFTPPort.Text.Trim()));        string FilePath = txt_ImageSaveDir.Text  "\\";//Application.StartupPath  "\\Data\\FtpSend\\";//FTPDown.Properties.Settings.Default.LogPath  "\\"  Dtime.ToString("yyyyMMddHH")  ".xml";        DirectoryInfo Dir = new DirectoryInfo(FilePath);        if (Dir.Exists)        {          FTP.Login(this.txtFTPUserName.Text.Trim(), this.txtFTPUserPass.Text.Trim());          string[] AllDFTPDirs = Directory.GetDirectories(txt_ImageSaveDir.Text  "\\");          foreach (var item in AllDFTPDirs)//D:\as\C80672986  精确到编号          {            string CurrentPath = item;            string LastPath = item.Substring(item.LastIndexOf(@"\")  1);            string[] AllInnerDatetimeDir = Directory.GetDirectories(item);//各个日期列表            //循环日期文件夹            try            {              for (int cc = 0; cc < AllInnerDatetimeDir.Length; cc )//循环日期文件夹              { string CurrentDatETimeFiles = AllInnerDatetimeDir[cc]; string[] StrFiles; StrFiles = Directory.GetFiles(CurrentDatETimeFiles); string lastinnerpath = CurrentDatETimeFiles.Substring(CurrentDatETimeFiles.LastIndexOf(@"\")  1); for (int i = 0; i < StrFiles.Length; i ) {   string FileName = StrFiles[i];   if (File.Exists(FileName))   {     string FileNamePath = local_loginPath  ""  LastPath  ".txt";     #region 上传过得不在上传     try     {       if (!File.Exists(FileName)) File.Create(FileNamePath).Close();       string InnerLogText = File.ReadAllText(FileNamePath, Encoding.Default);       if (InnerLogText.Contains(FileName)) continue;     }     catch     {     }     #endregion     try     {       FTP.ConnectMode = FTPConnectMode.PASV;       FTP.TransferType = FTPTransferType.BINARY;       //bool contains = File.Exists("/"  LastPath);       //循环上传文件夹       try       {         Console.WriteLine(lastinnerpath);         //FTP.ChDir("/"  LastPath);         String[] files = FTP.Dir("/", false);         bool flag = false;         foreach (var iteminner in files)//循环编号文件夹         {           if (iteminner.Contains(LastPath))//是否包含编号目录           {             flag = true;           }//end if(iteminner.Contains(LastPath))         }// foreach (var iteminner in files)         if (!flag)         {           FTP.MkDir("/"  LastPath);         }         //是否存在内部的日期文件夹         bool innerFilesFlag = false;         foreach (var iteminner in files)//循环编号文件夹         {           string[] filesInner = FTP.Dir("/"  LastPath, false);           foreach (var itemInner in filesInner)           {             if (iteminner.Contains(lastinnerpath))             {innerFilesFlag = true;             }           }//end foreach (var itemInner in filesInner)内层循环         }//end foreach (var iteminner in files)//循环编号文件夹         if (!innerFilesFlag)//不存在内部的日期文件夹         {           FTP.MkDir("/"  LastPath  "/"  lastinnerpath);         } //创建内部文件夹日期文件夹       }       catch (Exception ex)       {         Console.WriteLine(ex.Message);         Console.WriteLine(ex.StackTrace);         //FTP.MkDir("/"  LastPath);       }       string dirLujing = "\\"  LastPath  "\\"  lastinnerpath  "\\"  Path.GetFileName(StrFiles[i]);       FTP.Put(FileName, dirLujing);//上传目录按照目录上传文件        #region 存储上传文件名       try       {         File.AppendAllText(FileNamePath, FileName  "\r\n", Encoding.Default);       }       catch       {       }       #endregion       Console.WriteLine(FileName);       if (cl_FTPClearFile.Checked)//如果FTP上传后删除文件选中 则清除FTP文件       {         File.Delete(FileName);       }     }     catch (Exception ex)     {       Console.WriteLine(ex.Message);       Console.WriteLine(ex.StackTrace);       FTP.QuitImmediately();     }   }//if (File.Exists(FileName)) } //for (int i = 0; i < str.Length; i )              }// //循环日期文件夹for (int cc = 0; cc < AllInnerDatetimeDir.Length; cc )             }            catch            {              FTP.QuitImmediately();            }          }//end foreach          FTP.QuitImmediately();        }//end if      }      catch { }    }    private void button1_Click(object sender, EventArgs e)    {      //if (System.DateTime.Now.Hour == 12 && System.DateTime.Now.Minute == 0)      {        string CurrentText = this.txt_log.Text;        this.txt_log.Text = "";        string dir = local_loginPath  "Alltimes\\";        if (!Directory.Exists(dir))        {          Directory.CreateDirectory(dir);        }        File.AppendAllText(dir  System.DateTime.Now.ToString("yyyyMMdd")  ".txt", CurrentText, Encoding.Default);      }      try      {        if (Thread_FtpUp != null)        {          Thread_FtpUp.Abort();          Thread_FtpUp = null;        }        Thread_FtpUp = new Thread(FtpUp);        Thread_FtpUp.Start();      }      catch      {      }    }    //通讯会话    string Local_sessionid = "";    //摄像头ID    string Local_Cameraid = "";    //摄像头通道号    int Local_cameraNO = 1;    ys000.HkSDK.PTZCommand enCommand = HkSDK.PTZCommand.AUTO;    ys000.HkSDK.PTZAction Action = HkSDK.PTZAction.STOP;    /// <summary>    /// 向上按下显示    /// </summary>    /// <param name="sender"></param>    /// <param name="e"></param>    private void btn_up_MouseDown(object sender, MouseEventArgs e)    {      try      {        if (string.IsNullOrEmpty(Local_sessionid))        {          return;        }        int result = ys000.HkSDK.OpenSDK_PTZCtrlEx(Local_Cameraid, Local_Cameraid, Local_cameraNO, HkSDK.PTZCommand.UP, HkSDK.PTZAction.START, 2);        if (result == 1)        {          Console.WriteLine("OK");        }      }      catch (Exception ex)      {        Console.WriteLine(ex.Message);        Console.WriteLine(ex.StackTrace);      }    }    //向上放开执行    private void btn_up_MouseUp(object sender, MouseEventArgs e)    {      try      {        int result = ys000.HkSDK.OpenSDK_PTZCtrlEx(Local_Cameraid, Local_Cameraid, Local_cameraNO, HkSDK.PTZCommand.UP, HkSDK.PTZAction.STOP, 2);        if (result == 1)        {          Console.WriteLine("OK");        }      }      catch      {      }    }  }}

 
  
					
				
评论