在我之前的调查中,我发现即使Windows文件浏览器在嵌入状态下启动word.exe,Documents集合仍然是空的。
当我制作嵌入式应用程序visible时,他们会在其中加载一个文档,进行进一步的研究:
public static class WordAppExt
{
public static Word.Document GetActiveDoc(this Word.Application App)
{
try
{
App.Visible = true;
if (App.Documents.Count > 0)
{
return App.ActiveDocument;
}
else
{
return null;
}
}
catch (Exception)
{
return null;
}
}
}
所以我得出结论,资源管理器只需要启动单词,但它没有托管单词内的文档。这意味着Windows资源管理器可能是IOleContainer。如果为true,则表示可以通过EnumObjects访问预览窗格中嵌入的任何对象。
不幸的是,我的代码在VSTO插件中运行,我无法访问资源管理器com对象,所以我无法为IOleContainer执行QI。但我有一个理论认为,可能有另一种通过PreviewHandler访问Document COM对象的方法。我认为启动Word,Powerpoint和Excel的原因是要注册还是初始化previewHandler?
所以HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ PreviewHandlers有一个与IPreviewHandler相关联的guid列表,用于不同的文件类型。
有很多关于如何为新文件类型创建自己的previewHandler的文章:
但是我想用自己的替换单词预览处理程序。如果我无法取代它,我会非常乐意拦截现有的预览处理程序。