C#实现屏幕录像 网上看到的看起来不错

  using System;
  using System.Collections.Generic;
  using System.ComponentModel;
  using System.Data;
  using System.Drawing;
  using System.Text;
  using System.Windows.Forms;
  using WMEncoderLib;
  using System.Runtime.InteropServices;
  using Microsoft.Win32;
  using System.Threading;
  using System.IO;
  using System.Drawing.Drawing2D;
  有关系统托盘#region 有关系统托盘
  /**
  /// 托盘图标类实例
  ///
  private NotifyIcon notifyIcon;
  /**
  /// 托盘菜单
  ///
  private ContextMenu notificationMenu;
  /**
  /// 初始化托盘
  ///
  public void NotificationIcon()
  {
  notifyIcon = new NotifyIcon();
  notificationMenu = new ContextMenu(InitializeMenu());
  notifyIcon.DoubleClick += IconDoubleClick;
  notifyIcon.Icon = this.Icon;
  notifyIcon.ContextMenu = notificationMenu;
  notifyIcon.Visible = true;
  }
  /**
  /// 托盘菜单
  ///
  ///
  private MenuItem[] InitializeMenu()
  {
  //加载主题菜单
  MenuItem SkinMenu = new MenuItem("主题");
  DirectoryInfo dir = new DirectoryInfo(Application.StartupPath + "\\Skin");
  foreach (FileInfo skinfile in dir.GetFiles())
  {
  string skinname = skinfile.Name.Substring(0, (int)skinfile.Name.Length - 4);
  SkinMenu.MenuItems.Add(new MenuItem(skinname, ChangeSkin));
  }
  //
  //
  MenuItem[] menu = new MenuItem[]
  {
  new MenuItem("显示主窗口", IconDoubleClick),
  new MenuItem("隐藏主窗口", HideMainForm),
  SkinMenu,
  new MenuItem("关于", menuAboutClick),
  new MenuItem("退出", menuExitClick)
  };
  return menu;
  }
  托盘事件#region 托盘事件
  /**
  /// 托盘关于菜单
  ///
  ///
  ///
  private void menuAboutClick(object sender, EventArgs e)
  {
  if (about == null || about.IsDisposed)
  about = new About();
  about.Show();
  }
  /**
  /// 托盘退出菜单
  ///
  ///
  ///
  private void menuExitClick(object sender, EventArgs e)
  {
  this.notifyIcon.Visible = false;
  Application.Exit();
  }
  /**
  /// 双击托盘图标显示主窗口
  ///
  ///
  ///
  private void IconDoubleClick(object sender, EventArgs e)
  {
  this.Visible = true;
  this.WindowState = FormWindowState.Normal;
  }
  /**
  /// 隐藏主窗口
  ///
  ///
  ///
  private void HideMainForm(object sender, EventArgs e)
  {
  this.WindowState = FormWindowState.Minimized;
  this.Visible = false;
  }
  /**
  /// 改变风格
  ///
  ///
  ///
  private void ChangeSkin(object sender, EventArgs e)
  {
  string skinname = ((MenuItem)sender).Text;
  SetSkin(skinname);
  ConfigManager.AppSetings appseting = new ConfigManager.AppSetings();
  appseting.UpdateKey("skin", skinname);
  }
  #endregion
  #endregion
  Win32#region Win32
  [DllImport("user32")]
  static extern IntPtr SetCapture(IntPtr hwnd);
  [DllImport("user32")]
  static extern IntPtr ReleaseCapture();
  [DllImport("user32.dll")]
  static extern IntPtr WindowFromPoint(IntPtr xPoint, IntPtr yPoint);
  [DllImport("user32.dll")]
  static extern IntPtr GetDC(IntPtr hWnd);
  [StructLayout(LayoutKind.Sequential)]
  public struct RECT
  {
  public int left;
  public int top;
  public int right;
  public int bottom;
  public int Width() { return right - left; }
  public int Height() { return bottom - top; }
  }
  [DllImport("user32.dll")]
  // 注意,运行时知道如何列集一个矩形
  static extern IntPtr GetWindowRect(IntPtr hwnd, ref RECT rc);
  [DllImport("user32.dll")]
  static extern IntPtr PostMessage(IntPtr hWnd, IntPtr iMsg, IntPtr wParam, IntPtr lParam);
  #endregion
  成员#region 成员
  private WMEncoder enc;
  IWMEncSourcePluginInfoManager wspim;
  Rectangle lastrect = new Rectangle(0, 0, 0, 0);
  private About about;
  public fScreen screen;
  private Thread th;
  private delegate void VoidDelegate();
  #endregion
  /**/// /
  ///
  /// 程序初始化
  ///
  private void AppInit()
  {
  enc = new WMEncoderClass();
  LoadSeting();
  }
  /**
  /// 设置皮肤
  ///
  ///
  private void SetSkin(string SkinName)
  {
  this.skin.SerialNumber = "";
  this.skin.SkinFile = "Skin\\" + SkinName + ".ssk";
  }
  /**
  /// 初始压缩选项列表
  ///
  private void InitCompression()
  {
  //
  ConfigManager.AppSetings appseting = new ConfigManager.AppSetings();
  string Compression = appseting.ReadKeyValue("Compression");
  //
  enc = new WMEncoderClass();
  wspim = enc.SourcePluginInfoManager;
  wspim.Refresh();
  IWMEncProfileCollection wpfc = enc.ProfileCollection;
  IWMEncProfile wp;
  this.CompressionOptionListBox.Items.Clear();
  for (int i = 0; i
  /// 加载设置
  ///
  private void LoadSeting()
  {
  ConfigManager.AppSetings appseting = new ConfigManager.AppSetings();
  //是否录制声音
  this.ChkSound.Checked =Convert.ToBoolean(appseting.ReadKeyValue("ChkSoun d"));
  //是否隐藏主窗体
  this.ChkHideMainForm.Checked = Convert.ToBoolean(appseting.ReadKeyValue("ChkHideM ainForm"));
  //快捷键设置
  this.SkStartAndPause.Text = appseting.ReadKeyValue("SKey_StartAndPause");
  this.SkStop.Text = appseting.ReadKeyValue("SKey_Stop");
  this.SkShowAndHide.Text = appseting.ReadKeyValue("SKey_ShowAndHide");
  //录制区域
  int rect = Convert.ToInt32(appseting.ReadKeyValue("CameraRect "));
  if (rect == 1)
  this.RWindow.Checked = true;
  else
  this.RScreen.Checked = true;
  //
  Size sz = MainForm.GetScreenSize();
  this.rw.Text = sz.Width.ToString();
  this.rh.Text = sz.Height.ToString();
  }
  /**
  /// 取得选择的压缩选项
  ///
  ///
  private IWMEncProfile2 GetSelectCompressionOption()
  {
  IWMEncProfileCollection wpfc = enc.ProfileCollection;
  IWMEncProfile wp;
  IWMEncProfile2 wp2 = new WMEncProfile2Class();
  if (this.CompressionOptionListBox.SelectedIndex == -1)
  {
  return null;
  }
  for (int i = 0; i
  /// 开始录制
  ///
  private void StartCamera()
  {
  IWMEncSourceGroupCollection SrcGrpColl;
  IWMEncSourceGroup2 SrcGrp;
  IWMEncAudioSource SrcAud;
  IWMEncVideoSource2 SrcVid;
  IWMEncProfile2 Pro;
  enc = new WMEncoderClass();
  //-------------------------------------------
  try
  {
  SrcGrpColl = enc.SourceGroupCollection;
  SrcGrp = (IWMEncSourceGroup2)SrcGrpColl.Add("SG_1");
  SrcVid = (IWMEncVideoSource2)SrcGrp.AddSource(WMENC_SOURCE_ TYPE.WMENC_VIDEO);
  //是否录制声音
  if (this.ChkSound.Checked)
  {
  SrcAud = (IWMEncAudioSource)SrcGrp.AddSource(WMENC_SOURCE_T YPE.WMENC_AUDIO);
  SrcAud.SetInput("Default_Audio_Device", "DEVICE", "");
  }
  SrcVid.SetInput("ScreenCapture1", "ScreenCap", "");
  指定屏幕区域录制#region 指定屏幕区域录制
  if (this.RectCustom.Checked)
  {
  Size priScreen = SystemInformation.PrimaryMonitorSize;
  float xx = (float)SrcVid.Height / (float)priScreen.Height;
  float yy = (float)SrcVid.Width / (float)priScreen.Width;
  int ix = Convert.ToInt32(this.rx.Text);
  int iy = Convert.ToInt32(this.ry.Text);
  int ih = Convert.ToInt32(this.rh.Text);
  int iw = Convert.ToInt32(this.rw.Text);
  SrcVid.CroppingLeftMargin = (int)((float)ix * yy);
  SrcVid.CroppingTopMargin = (int)((float)iy * xx);
  if (SrcVid.CroppingLeftMargin >= priScreen.Width)
  {
  MessageBox.Show("屏幕区域外!");
  return;
  }
  if (SrcVid.CroppingTopMargin >= priScreen.Height)
  {
  MessageBox.Show("屏幕区域外!");
  return;
  }
  int ibm = priScreen.Height - ih - iy;
  if (ibm
  /// 构造
  ///
  public MainForm()
  {
  InitializeComponent();
  //Control.CheckForIllegalCrossThreadCalls = false;
  //加载皮肤
  ConfigManager.AppSetings appseting = new ConfigManager.AppSetings();
  string skin = appseting.ReadKeyValue("skin");
  this.SetSkin(skin);
  //
  //初始托盘
  NotificationIcon();
  //
  //窗体大小固定
  this.MinimumSize=this.Size;
  this.MaximumSize = this.Size;
  }
  /**
  /// 主窗体加载事件
  ///
  ///
  ///
  private void MainForm_Load(object sender, EventArgs e)
  {
  AppInit();
  InitCompression();
  }
  /**
  /// 选择输出文件保存路径
  ///
  ///
  ///
  private void SelectOutPathButton_Click(object sender, EventArgs e)
  {
  SaveFileDialog sfd = new SaveFileDialog();
  sfd.Filter = "WMV文件(*.wmv)|*.wmv";
  sfd.RestoreDirectory = true;
  if (sfd.ShowDialog() == DialogResult.OK)
  {
  this.OutFilePathTextBox.Text = sfd.FileName;
  if(File.Exists(sfd.FileName))
  File.Delete(sfd.FileName);
  }
  }
  /**
  /// 开始录制
  ///
  ///
  ///
  private void StartButton_Click(object sender, EventArgs e)
  {
  if (this.CompressionOptionListBox.SelectedIndex > -1 && this.OutFilePathTextBox.Text.Trim() != "")
  {
  th = new Thread( new ThreadStart(start));
  th.IsBackground = true;
  th.Start();
  //将开始按钮不可用
  this.StartButton.Enabled = false;
  //暂停按钮可用
  this.PauseButton.Enabled = true;
  //
  //窗体隐藏
  if (this.ChkHideMainForm.Checked)
  {
  this.WindowState = FormWindowState.Minimized;
  this.Visible = false;
  }
  }
  else
  {
  if (this.OutFilePathTextBox.Text.Trim() == "")
  MessageBox.Show("请选择录像文件保存位置");
  if (this.CompressionOptionListBox.SelectedIndex == -1)
  MessageBox.Show("请选择一种压缩方案");
  }
  }
  private void start()
  {
  VoidDelegate dstart = new VoidDelegate(StartCamera);
  this.Invoke(dstart);
  }
  /**
  /// 停止录制按钮
  ///
  ///
  ///
  private void StopButton_Click(object sender, EventArgs e)
  {
  th.Abort();
  enc.Stop();
  this.StartButton.Enabled = true;
  this.PauseButton.Enabled = false;
  }
  /**
  /// 暂停录制按钮
  ///
  ///
  ///
  private void PauseButton_Click(object sender, EventArgs e)
  {
  if (this.PauseButton.Text != "继续录制")
  {
  enc.Pause();
  this.PauseButton.Text = "继续录制";
  }
  else
  {
  enc.Start();
  this.PauseButton.Text = "暂停录制";
  }
  }
  /**
  /// 单击主窗体关闭按钮
  ///
  ///
  ///
  private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
  {
  if (e.CloseReason != CloseReason.ApplicationExitCall && e.CloseReason != CloseReason.WindowsShutDown)
  {
  e.Cancel = true;
  this.WindowState = FormWindowState.Minimized;
  this.Visible= false;
  }
  else
  {
  //none
  }
  }
  /**
  /// 压缩选项更改
  ///
  ///
  ///
  private void CompressionOptionListBox_SelectedIndexChanged(obje ct sender, EventArgs e)
  {
  ListBox lb = (ListBox)sender;
  ConfigManager.AppSetings appseting = new ConfigManager.AppSetings();
  appseting.UpdateKey("Compression", lb.Items[lb.SelectedIndex].ToString());
  }
  /**
  /// 压缩选项更改
  ///
  ///
  ///
  private void CompressionOptionListBox_MouseClick(object sender, MouseEventArgs e)
  {
  ListBox lb = (ListBox)sender;
  ConfigManager.AppSetings appseting = new ConfigManager.AppSetings();
  appseting.UpdateKey("Compression", lb.Items[lb.SelectedIndex].ToString());
  }
  快捷键#region 快捷键
  /**
  /// 快捷键
  ///
  ///
  ///
  private void SkStartAndPause_TextChanged(object sender, EventArgs e)
  {
  ConfigManager.AppSetings appseting = new ConfigManager.AppSetings();
  appseting.UpdateKey("SKey_StartAndPause", this.SkStartAndPause.Text);
  }
  //
  private void SkStop_TextChanged(object sender, EventArgs e)
  {
  ConfigManager.AppSetings appseting = new ConfigManager.AppSetings();
  appseting.UpdateKey("SKey_Stop", this.SkStartAndPause.Text);
  }
  //
  private void SkShowAndHide_TextChanged(object sender, EventArgs e)
  {
  ConfigManager.AppSetings appseting = new ConfigManager.AppSetings();
  appseting.UpdateKey("SKey_ShowAndHide", this.SkShowAndHide.Text);
  }
  #endregion
  #region 录制区域
  private void RScreen_CheckedChanged(object sender, EventArgs e)
  {
  ConfigManager.AppSetings appseting = new ConfigManager.AppSetings();
  appseting.UpdateKey("CameraRect", "0");
  }
  private void RWindow_CheckedChanged(object sender, EventArgs e)
  {
  ConfigManager.AppSetings appseting = new ConfigManager.AppSetings();
  appseting.UpdateKey("CameraRect", "1");
  }
  /**
  /// 指定屏幕区域
  ///
  ///
  ///
  private void RectCustom_Click(object sender, EventArgs e)
  {
  if (this.RectCustom.Checked)
  {
  screen = new fScreen();
  this.Hide();
  this.WindowState = FormWindowState.Minimized;
  System.Threading.Thread.Sleep(220);
  //创建一个和屏幕一样大的Bitmap
  Size size = MainForm.GetScreenSize();
  Image myImage = new Bitmap(size.Width, size.Height);
  //从一个继承自Image类的对象中创建Graphics对象
  Graphics gc = Graphics.FromImage(myImage);
  gc.SmoothingMode = SmoothingMode.HighQuality;
  //抓屏并拷贝到myimage里
  gc.CopyFromScreen(new Point(0, 0), new Point(0, 0), size);
  //保存为文件
  screen.BackgroundImage = myImage;
  screen.WindowState = FormWindowState.Maximized;
  screen.TopMost = true;
  screen.ShowDialog();
  screen.Focus();
  screen.TopMost = false;
  screen.Refresh();
  myImage.Dispose();
  gc.Dispose();
  }
  //
  ConfigManager.AppSetings appseting = new ConfigManager.AppSetings();
  appseting.UpdateKey("CameraRect", "2");
  }
  #endregion
  /**
  /// 是否录声音
  ///
  ///
  ///
  private void ChkSound_CheckedChanged(object sender, EventArgs e)
  {
  ConfigManager.AppSetings appseting = new ConfigManager.AppSetings();
  appseting.UpdateKey("ChkSound", this.ChkSound.Checked.ToString());
  }
  //是否隐藏主窗体
  private void ChkHideMainForm_CheckedChanged(object sender, EventArgs e)
  {
  ConfigManager.AppSetings appseting = new ConfigManager.AppSetings();
  appseting.UpdateKey("ChkHideMainForm", this.ChkHideMainForm.Checked.ToString());
  }
  /**///
  ///
  /// 取得屏幕大小
  ///
  ///
  public static Size GetScreenSize()
  {
  //获得当前屏幕的分辨率
  Screen scr = Screen.PrimaryScreen;
  Rectangle rc = scr.Bounds;
  Size size = new Size(rc.Width, rc.Height);
  return size;
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值