mediacapture.cs

来自「自己做的一个浏览器~~大家请看看~如果合意给个彩头」· CS 代码 · 共 232 行

CS
232
字号
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;
using APLib.Native.WMP;
using APLib.Native.Real;
using APLib.Native.ShockwaveFlash;

namespace WebPort.Tools
{
	/// <summary>
	/// MediaCapture窗体类
	/// 获取网页上的播放器控件正在播放的媒体文件地址
	/// </summary>
	public partial class MediaCapture : Form
	{
		/// <summary>
		/// 网页对象
		/// </summary>
		public HtmlDocument Document;
		/// <summary>
		/// 停止搜索线程标志
		/// </summary>
		private bool stop;
		/// <summary>
		/// 搜索线程
		/// </summary>
		private Thread captureTh;

		/// <summary>
		/// 构造函数
		/// </summary>
		public MediaCapture()
		{
			InitializeComponent();
		}

		private void MediaCapture_Load(object sender, EventArgs e)
		{
			StartCapture();
		}

		private void MediaCapture_FormClosing(object sender, FormClosingEventArgs e)
		{
			StopCapture();
		}

		#region 控件事件

		private void btnCapture_Click(object sender, EventArgs e)
		{
			StartCapture();
		}

		private void btnStop_Click(object sender, EventArgs e)
		{
			StopCapture();
		}

		private void btnCopy_Click(object sender, EventArgs e)
		{
			string text = string.Empty;
			foreach (ListViewItem item in list.SelectedItems)
			{
				text += item.SubItems["URL"].Text + "\n";
			}
			if ((text != null) && (text.Length > 0))
			{
				Clipboard.Clear();
				Clipboard.SetText(text);
			}
		}

		private void btnClose_Click(object sender, EventArgs e)
		{
			if (!stop)
				StopCapture();
			this.Close();
		}

		private void list_DoubleClick(object sender, EventArgs e)
		{
			if (list.SelectedItems.Count == 1)
			{
				string url = list.SelectedItems[0].SubItems["URL"].Text;
				try
				{
					if (url != null)
					{
						Uri uri;
						if (!Uri.TryCreate(url, UriKind.Absolute, out uri))
						{
							if (Document.Url.IsAbsoluteUri)
							{
								string baseUrl = Document.Url.AbsoluteUri;
								baseUrl = baseUrl.Substring(0, baseUrl.LastIndexOf('/') + 1);
								url = baseUrl + url;
							}
						}
						else
							url = uri.ToString();
						ProcessStartInfo p = new ProcessStartInfo();
						p.FileName = url;
						p.UseShellExecute = true;
						Process.Start(p);
					}
				}
				catch
				{
				}
			}
		}

		#endregion

		/// <summary>
		/// 开始搜索线程
		/// </summary>
		private void StartCapture()
		{
			if (Document != null)
			{
				if (captureTh != null)
					StopCapture();
				stop = false;
				captureTh = new Thread(new ThreadStart(CaptureThread));
				captureTh.Start();
				UpdateButton(true);
			}
		}
		/// <summary>
		/// 停止搜索线程
		/// </summary>
		private void StopCapture()
		{
			stop = true;
			try
			{
				if (captureTh != null)
					if (!captureTh.Join(5000))
						captureTh.Abort();
				captureTh = null;
				UpdateButton(false);
			}
			catch
			{
				MessageBox.Show("Can't stop capture thread");
			}
		}
		/// <summary>
		/// 更新按钮状态
		/// </summary>
		/// <param name="running">搜索标志</param>
		private void UpdateButton(bool running)
		{
			if (running)
			{
				btnCapture.Enabled = false;
				btnStop.Enabled = true;
			}
			else
			{
				btnCapture.Enabled = true;
				btnStop.Enabled = false;
			}
		}
		/// <summary>
		/// 搜索线程
		/// </summary>
		private void CaptureThread()
		{
			int i = 0;
			while ((!stop) && (i < Document.All.Count))
			{
				HtmlElement element = Document.All[i];
				if (element.TagName.ToLower() == "object")
				{
					object obj = element.DomElement.GetType().GetProperty("object").GetValue(element.DomElement, null);
					switch (element.GetAttribute("classid").ToUpper())
					{
						case "CLSID:6BF52A52-394A-11D3-B153-00C04F79FAA6":	//wmp
							IWMPPlayer wmp = obj as IWMPPlayer;
							if (wmp != null)
								AddToList("WMP", wmp.URL);
							break;
						case "CLSID:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA":	//real
							IRealAudio ra = obj as IRealAudio;
							if (ra != null)
								AddToList("Real", ra.Source);
							break;
						case "CLSID:D27CDB6E-AE6D-11CF-96B8-444553540000":	//flash
							IShockwaveFlash flash = obj as IShockwaveFlash;
							if (flash != null)
								AddToList("Flash", flash.Movie);
							break;
					}
				}
				i++;
			}
			this.Invoke(new MethodInvoker(delegate
			{
				UpdateButton(false);
			}));
			stop = true;
		}
		/// <summary>
		/// 添加源文件地址到列表
		/// </summary>
		/// <param name="type">媒体控件类型</param>
		/// <param name="url">媒体文件地址</param>
		private void AddToList(string type, string url)
		{
			this.Invoke(new MethodInvoker(delegate
							{
								ListViewItem item = new ListViewItem();
								item.Name = "Type";
								item.Text = type;
								ListViewItem.ListViewSubItem subitem = new ListViewItem.ListViewSubItem();
								subitem.Name = "URL";
								subitem.Text = url;
								item.SubItems.Add(subitem);
								list.Items.Add(item);
								list.Update();
							}));
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?