下面是主要代码, 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; }