【发布时间】:2018-01-18 23:25:19
【问题描述】:
目标是获取在我有进程引用的 Microsoft Word 实例中打开的文档的完整路径。
伪代码示例:
Process myWordProcess = something; // This is my process reference
DocumentInformation docInfo = SomeNamespace.GetDocumentInformation(myWordProcess);
string documentPath = docInfo.FullName; // "C:\User\Foo\Documents\Test.docx"
起点是由WINWORD.exe执行的Process对象。
我不是在寻找一种包含解析 process.MainWindowTitle 的方法,而是一种更“合适”的解决方案。
在进行了相当多的初步研究后,我相信需要的是 Windows Accessibility API。
Pinvoke 提到了AccessibleObjectFromWindow 签名。话虽如此,生成的 accessible 对象并没有为我提供比 process 已经提供的更多信息。
这是我从 Pinvoke 中尝试过的:
internal enum OBJID : uint
{
WINDOW = 0x00000000,
SYSMENU = 0xFFFFFFFF,
TITLEBAR = 0xFFFFFFFE,
MENU = 0xFFFFFFFD,
CLIENT = 0xFFFFFFFC,
VSCROLL = 0xFFFFFFFB,
HSCROLL = 0xFFFFFFFA,
SIZEGRIP = 0xFFFFFFF9,
CARET = 0xFFFFFFF8,
CURSOR = 0xFFFFFFF7,
ALERT = 0xFFFFFFF6,
SOUND = 0xFFFFFFF5,
}
public class DocumentLocator
{
[DllImport("oleacc.dll")]
internal static extern int AccessibleObjectFromWindow(IntPtr hwnd, uint id, ref Guid iid, [In] [Out] [MarshalAs(UnmanagedType.IUnknown)] ref object ppvObject);
public static void GetWordInfo(Process process)
{
var mainWindowHandle = process.MainWindowHandle;
var guid = new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}");
object obj = null;
var retVal = AccessibleObjectFromWindow(mainWindowHandle, (uint)OBJID.WINDOW, ref guid, ref obj);
var accessible = (IAccessible) obj; // Not much information is contained in this object
}
}
也许解决方案是以某种方式从进程或窗口句柄中获取Document 接口(Office COM Interop,see here for the interface)?或者,也许,首先获得Window,然后获得Document?
然后,配备来自 Office Interop 的信息,可以读取 Path 属性。
我愿意接受任何解决方案。
如果您知道如何针对 Excel 或 PowerPoint 执行此操作 - 那也可以,因为我假设可以对 Word 应用相同的过程(在更改几个界面和 GUID 之后)。
【问题讨论】:
标签: c# winapi com office-interop com-interop