PreviewHandler用法(一)

来源:互联网 发布:淘宝网短裤套装 编辑:程序博客网 时间:2024/06/05 16:39

    Windows 7操作系统有一个新功能,那就是文件预览,即不打开文件,就能看到其内容。效果如下图所示。

    

只有提供了预览接口的文件才能被预览,如WORD EXCEL 视频,音频,图片,HTML等。要看哪些文件可以预览,可以从注册表中查看,如下图所示。

路径是:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PreviewHandlers

    

    其实要实现这个功能也不难,主要用到的是IPreviewHandler COM 接口,以下程序就是我用WPF实现这个功能。如下图所示: 

    

首先说下我这个程序的功能。界面上分为三大部分,最右部分是Preview区域 (区域3),左上部分是显示文件列表 (区域1),左下部分可以重新选定文件列表文件夹 (区域2)。

这个程序是用WPF写的,用到的技术有托管C++(用于取文件的图标或缩略图)。

数据绑定(数据源绑定到显示列表上)。

文件监听(FileSystemWatcher类)。

绑定属性更改通知(INotifyPropertyChanged接口)。

取预览图(IPreviewHandler接口)。

今天主要说一下如何利用IPreviewHandler接口得到文件的预览图,其他的就不重点说明,但我也会对其作一些简单说明。


    一. 工程组织结构

   

CommonLib工程是一个托管C++工程(Managed C++),它是一个DLL,主要用于写一些共通的方法,这里面有一个类CommonHelper,它包含了一系列的静态方法和常用的宏。

PreviewHandlerSample工程是一个WPF工程,其中有三个页面文件,分别是

FolderBrowser.xaml:界面左下部分,用户可以通过上面的按钮选择一个新的文件夹。 

ListBoxItem.xaml:表示ListBox中的一个Item.

MainWindow.xaml:主窗体界面

该工程还包含三个类:

FileEntity.cs:表示文件实体,包含文件路径,文件名,扩展名,文件大小等属性。

ListManager.cs:用于容纳FileEntity的集合,它继承于ObservableCollection<FileEntity>类和INotifyPropertyChanged接口。该类实现了文件目录监听功能,如果在监听目录内,有文件发生改变,就激发相应的事件。

PreviewsManager.cs:该类利用IPreviewHandler接口得到文件的预览图。这是最核心的类。


二. 取文件预览图的原理

核心接口是IPreviewHandler,它是Microsoft制定的一个接口,由各大厂商去实现,比如WORD, EXCEL,PDF等。比如 “Microsoft Office Excel 预览器”,它就实现了IPreviewHandler接口,在注册表中是能找到的,他对应的GUID是{00020827-0000-0000-C000-000000000046}。要实现这个功能,就要根据其后缀到注册表中找到预览接口的GUID。这就会有几个问题:1)如何得到Preview Handler的GUID。2)如何利用IPreviewHandler的函数实现区预览图功能。3)IPreviewHandler是COM接口,如何与C#交互。下面我会对这三个问题一一说明。

    未完待续,敬看下文