[转载]WPF中实现对Flash的播放及(循环)截图 – SongShu – 博客园.
要想实现Flash的播放支持,需要借助Flash自身的ActiveX控件.
而WPF作为一种展现层的技术,不能自身插入COM组件,必需借助Windows Form引入ActiveX控件.
比较标准的实现方法,可以参考以下链接:http://blogs.msdn.com/b/jijia/archive/2007/06/07/wpf-flash-activex.aspx
而本文则是介绍通过借助System.Windows.Forms下的WebBrowser实现.
但无论是那一种方法,本质上都是通过在WPF程序中引用Windows Form窗体,再在其内引入ActiveX控件.
实现对Flash的播放
首先,引入可在WPF上承载 Windows 窗体控件的元素:WindowsFormsHost,及添加对 Windows 窗体的引用.
具体的实现过程:项目引用–添加引用–选择 “WindowsFormsIntegration” 及 “System.Windows.Forms” –添加
在WPF页面分别添加这两者的引用:
XAML中的所有实现代码:
< Window x:Class = "Capture.MainWindow" xmlns:host = "clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" xmlns:forms = "clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" Title = "File Capture" Height = "600" Width = "800" Unloaded = "Window_Unloaded" > < Grid > < Grid.ColumnDefinitions > < ColumnDefinition Width = "*" ></ ColumnDefinition > < ColumnDefinition Width = "150" ></ ColumnDefinition > </ Grid.ColumnDefinitions > < host:WindowsFormsHost x:Name = "host" > < forms:WebBrowser x:Name = "browser" ></ forms:WebBrowser > </ host:WindowsFormsHost > < Grid Background = "Gray" Grid.Column = "1" > < UniformGrid Rows = "5" VerticalAlignment = "Top" > < Button x:Name = "btnOpen" Width = "100" Height = "30" Click = "btnOpen_Click" Margin = "0,10" >Open File</ Button > < Button x:Name = "btnCapture" Width = "100" Height = "30" Click = "btnCapture_Click" Margin = "0,10" >Start Capture</ Button > < Button x:Name = "btnStop" Width = "100" Height = "30" Click = "btnStop_Click" Margin = "0,10" >Stop Capture</ Button > < CheckBox x:Name = "cboxLoop" IsChecked = "True" HorizontalAlignment = "Left" VerticalAlignment = "Center" Margin = "25,10,0,10" >Loop Capture</ CheckBox > </ UniformGrid > </ Grid > </ Grid > </ Window > |
当需要把一选中的Flash文件(.swf 文件)添加进WebBrowser 中播放:
browser.Navigate(currentPath);
实现对Flash的截图
实现对Flash的截图,只要使用WebBrowser的基类WebBrowserBase里面的DrawToBitmap方法.
参数Bitmap为所绘制的位图(需初始化位图的大小),Rectangle为截取WebBrowser内容的区域(大小)
private void Capture() { string fileName = System.IO.Path.GetFileNameWithoutExtension(currentPath); string capturePath = string .Format("{0}\\Capture\\{1}", System.Environment.CurrentDirectory, fileName); if (!Directory.Exists(capturePath)) { Directory.CreateDirectory(capturePath); } Bitmap myBitmap = new Bitmap(( int )host.ActualWidth, ( int )host.ActualHeight); System.Drawing.Rectangle DrawRect = new System.Drawing.Rectangle(0, 0, ( int )host.ActualWidth, ( int )host.ActualHeight); browser.DrawToBitmap(myBitmap, DrawRect); string timeNow = DateTime.Now.ToString("yyyyMMddHHmmssfff"); myBitmap.Save( string .Format("{0}\\{1}_{2}.png", capturePath, fileName, timeNow)); } |
界面效果:

如上图所示,本实例实现了对Flash的循环截图,时间间隔为1秒.本部分比较简单,
通过使用System.Windows.Threading下的DispatcherTimer即可实现.具体可参考本文最后的附件代码.
实例代码下载:
1 xmlns:host="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" 2 xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"