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;

namespace F.ScreenCamera
{
    
public partial class MainForm : Form
    
{

        
有关系统托盘

        
Win32

        
成员

        
///
        
/// <summary>
        
/// 程序初始化
        
/// </summary>

        private void AppInit()
        
{
            enc 
= new WMEncoderClass();
            LoadSeting();
        }

        
/// <summary>
        
/// 设置皮肤
        
/// </summary>
        
/// <param name="SkinName"></param>

        private void SetSkin(string SkinName)
        
{
            
this.skin.SerialNumber = "";
            
this.skin.SkinFile = "Skin\\" + SkinName + ".ssk";
        }

        
/// <summary>
        
/// 初始压缩选项列表
        
/// </summary>

        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 < wpfc.Count; i++)
            
{
                wp 
= wpfc.Item(i);
                
this.CompressionOptionListBox.Items.Add(wp.Name);
                
if (wp.Name == Compression)
                    
this.CompressionOptionListBox.SelectedIndex = i;
            }


        }

        
/// <summary>
        
/// 加载设置
        
/// </summary>

        private void LoadSeting()
        
{
            ConfigManager.AppSetings appseting 
= new ConfigManager.AppSetings();
            
//是否录制声音
           this.ChkSound.Checked =Convert.ToBoolean(appseting.ReadKeyValue("ChkSound"));
            
//是否隐藏主窗体
           this.ChkHideMainForm.Checked = Convert.ToBoolean(appseting.ReadKeyValue("ChkHideMainForm"));
            
//快捷键设置
           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();
        }

        
/// <summary>
        
/// 取得选择的压缩选项
        
/// </summary>
        
/// <returns></returns>

        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 < wpfc.Count; i++)
            
{
                wp 
= wpfc.Item(i);

                
if (this.CompressionOptionListBox.SelectedItem.ToString() == wp.Name)
                
{
                    wp2.LoadFromIWMProfile(wp);
                    
return wp2;
                }

            }

            
return null;
        }

        
/// <summary>
        
/// 开始录制
        
/// </summary>

        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_TYPE.WMENC_AUDIO);
                    SrcAud.SetInput(
"Default_Audio_Device""DEVICE""");
                }

                SrcVid.SetInput(
"ScreenCapture1""ScreenCap""");

                
指定屏幕区域录制

                
//确定压缩方式
                Pro = GetSelectCompressionOption();
                
if (Pro == null)
                
{
                    MessageBox.Show(
"错误!请选中 视频压缩模板!");
                    
return;
                }

                SrcGrp.set_Profile(Pro);

                
//检查输出文件名是否为空
                if (this.OutFilePathTextBox.Text.Length < 1)
                
{
                    MessageBox.Show(
"请指定保存路径!");
                    
return;
                }


                
输出文件名

                enc.Start();
            }

            
catch (Exception e1)
            
{
                MessageBox.Show(e1.Message);
            }


        }

        
///
        
/// <summary>
        
/// 构造
        
/// </summary>

        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;
        }

        
/// <summary>
        
/// 主窗体加载事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void MainForm_Load(object sender, EventArgs e)
        
{
            AppInit();
            InitCompression();
        }

        
/// <summary>
        
/// 选择输出文件保存路径
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        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);
            }

        }

        
/// <summary>
        
/// 开始录制
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        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);
        }

        
/// <summary>
        
/// 停止录制按钮
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void StopButton_Click(object sender, EventArgs e)
        
{
            th.Abort();
            enc.Stop();
            
this.StartButton.Enabled = true;
            
this.PauseButton.Enabled = false;
            
        }

        
/// <summary>
        
/// 暂停录制按钮
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void PauseButton_Click(object sender, EventArgs e)
        

            
if (this.PauseButton.Text != "继续录制")
            
{
                enc.Pause();
                
this.PauseButton.Text = "继续录制";
            }

            
else
            
{
                enc.Start();
                
this.PauseButton.Text = "暂停录制";
            }

        }

        
/// <summary>
        
/// 单击主窗体关闭按钮
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        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
            }

        }

        
/// <summary>
        
/// 压缩选项更改
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void CompressionOptionListBox_SelectedIndexChanged(object sender, EventArgs e)
        
{
            ListBox lb 
= (ListBox)sender;
            ConfigManager.AppSetings appseting 
= new ConfigManager.AppSetings();
            appseting.UpdateKey(
"Compression", lb.Items[lb.SelectedIndex].ToString());
        }

        
/// <summary>
        
/// 压缩选项更改
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        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());
        }


        
快捷键

        
录制区域
        
/// <summary>
        
/// 是否录声音
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        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());
        }


        
//
        
/// <summary>
        
/// 取得屏幕大小
        
/// </summary>
        
/// <returns></returns>

        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、付费专栏及课程。

余额充值