`
hgfghww6
  • 浏览: 42101 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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;
  }
分享到:
评论

相关推荐

    C#实现屏幕录像源代码

    本文将深入探讨如何使用C#语言来实现屏幕录像功能,基于提供的"Desktop2Wmv"项目源代码进行解析。 首先,C#是一种面向对象的编程语言,由微软公司开发,用于构建Windows应用程序、Web应用以及移动应用等。在C#中...

    C#+屏幕录像+源代码C#+屏幕录像+源代码

    C#+屏幕录像+源代码C#+屏幕录像+源代码C#+屏幕录像+源代码C#+屏幕录像+源代码C#+屏幕录像+源代码C#+屏幕录像+源代码

    C#屏幕录像程序(可以录像、截图、分割视频)

    在C#中实现屏幕录制,通常会涉及到Windows API的使用,如GDI+或DirectX。GDI+可以捕获屏幕上的像素信息,而DirectX则提供了更低级别的硬件访问,能够提供更高的性能。开发者可能会使用`Graphics.CopyFromScreen`方法...

    屏幕录像 C#源码

    在C#编程语言中,实现屏幕录像功能涉及到多个技术点,包括图像捕捉、视频编码、时间戳处理以及文件存储等。下面将详细介绍这些关键知识点。 1. 图像捕捉:在C#中,我们可以使用`System.Drawing`命名空间下的类来...

    c# 屏幕录像源码

    在C#中实现屏幕录像,主要涉及到以下几个关键知识点: 1. **图像捕获**:首先,你需要获取屏幕上的图像。C#中可以使用`System.Drawing`命名空间下的`Graphics`类和`Bitmap`类来实现。`Graphics`用于绘制图形,而`...

    屏幕录像 源码C#

    在本文中,我们将深入探讨如何使用C#语言实现屏幕录像功能,以及相关的关键知识点。 首先,屏幕录像涉及到的主要技术是图像捕获和视频编码。在C#中,我们可以利用Windows API(如GetDC函数)来获取桌面或特定窗口的...

    c# 屏幕录像可以录像、抓图

    屏幕录像模块使用说明书 使用说明 运行程序,打开程序主界面,如图1.1所示。本程序中可以录像、抓图。 图1.1 程序主界面 选择“选项”/“常规选项”命令,打开“常规选项”窗口,如图1.2所示,在这里可以设置录像...

    屏幕录像软件(C#代码)

    屏幕录像软件是用于捕获计算机屏幕...总之,通过C#实现屏幕录像软件需要对Windows API、视频编码原理以及多媒体处理有深入的理解。结合合适的库和框架,可以创建出高效、功能丰富的屏幕录像工具,满足不同用户的需求。

    屏幕录像,屏幕录像专家,C#源码.zip

    在本压缩包中,我们关注的是"屏幕录像专家"这一应用程序的C#源码实现。C#是一种面向对象的编程语言,由微软公司开发,被广泛用于Windows平台上的应用程序开发,包括桌面应用和游戏开发等。 1. **C#基础**: C#语言以...

    C# 屏幕录像模块

    本程序中可以录像、抓图。选择“选项”/“分割视频”命令,打开“视频分割”窗口,如图1.3所示。单击“打开”按钮,选择要分割的录像文件,然后单击“分解”按钮,获取文件大小及帧数,然后输入开始帧数和结束帧数,...

    C#视频实现照相、录像

    在C#编程环境中,开发与视频相关的应用程序是一项常见的任务,比如实现照相和录像功能。在给定的标题“C#视频实现照相、录像”中,我们可以理解为这是一个使用C#语言创建的项目,其目标是允许用户通过程序进行拍照和...

    c# 实现的屏幕取词

    实现屏幕取词的关键步骤如下: 1. **加载控件**:在C#项目中,首先需要添加对XdictGrb.dll的引用,这通常通过`using`指令来完成。然后,需要实例化该控件,以便后续调用其方法。 2. **屏幕捕获**:为了获取用户...

    c# 模拟 屏幕键盘

    c# 模拟 屏幕键盘c# 模拟 屏幕键盘c# 模拟 屏幕键盘c# 模拟 屏幕键盘c# 模拟 屏幕键盘c# 模拟 屏幕键盘c# 模拟 屏幕键盘c# 模拟 屏幕键盘c# 模拟 屏幕键盘c# 模拟 屏幕键盘c# 模拟 屏幕键盘c# 模拟 屏幕键盘c# 模拟 ...

    屏幕录像C#Winform

    屏幕录像功能在软件开发中是一项实用的技术,尤其是在教学、演示或者游戏录制等领域。在本项目中,我们将聚焦于使用C#编程语言和Windows Forms(Winform)框架来实现这一功能。C#是一种由微软开发的面向对象的编程...

    Winform实现屏幕录像Demo.rar

    在这个"Winform实现屏幕录像Demo"项目中,我们将看到如何集成屏幕捕获和视频编码技术来记录用户的屏幕活动。 首先,了解Winform的基础是至关重要的。Winform是基于Windows API的,提供了丰富的控件和事件处理机制,...

    C# 屏幕录像软件(源代码)

    《C# 屏幕录像软件源代码解析与实践》 屏幕录像软件在各种场景中都有广泛的应用,如教育、游戏、远程协作等。本篇将深入探讨一款基于C#语言编写的屏幕录像软件,该软件能够捕捉屏幕动态,并将记录的视频保存为AVI...

    C#实现调用视频摄像头录像和抓拍

    本项目聚焦于使用C#编程语言实现调用视频摄像头进行录像和抓拍功能,这在安全监控、远程协作、家庭自动化等多个场景中都有广泛的应用。 首先,我们要了解C#如何操作硬件资源。在.NET框架中,Microsoft提供了`System...

    屏幕录像软件 c#

    首先,要实现屏幕录像,我们需要理解几个核心概念和技术: 1. **捕获屏幕图像**:C#中的`System.Drawing`命名空间提供了获取屏幕快照的功能。`Screen`类可以用来获取所有显示器的信息,`Bitmap`类用于创建和保存...

    c#屏幕录像功能(音频+视频合并)源码

    1、本程序纯属娱乐开发,基本功能屏幕录像已经完成,音频采集,图片流已经经过压缩,所以影片有点点失真,但是不影响.NET4.5框架开发 欢迎大家下载 二、注意事项 1、开发环境为Visual Studio 2013使用.net 4.5开发...

    c# 实现的屏幕广播

    在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用、游戏以及服务器端应用程序时。在本项目中,"c# 实现的...掌握这些知识点,不仅能够实现屏幕广播功能,还能为其他网络通信项目打下坚实的基础。

Global site tag (gtag.js) - Google Analytics