1

这是一个可能的重复。找不到确切的,我记得很久以前经历过一个。

该工具需要能够检测是否从计算机的任何位置打开了任何 MS Word 文件。所以我们使用一个进程观察器,像这样:

string query = "SELECT TargetInstance FROM __Instance" + Event + "Event WITHIN 0.5 " +
               "WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name = '" + processName + "'";

string scope = @"\\.\root\CIMV2";

//Create a watcher and listen for events
watcher = new ManagementEventWatcher(scope, query);
watcher.EventArrived += eventHandler;
watcher.Start();

现在不管是什么,这里是棘手的部分:我需要获取当前打开的 WINWORD 进程的单词自动化实例。所以我Marshal.GetActiveObject用来获取正在运行的实例。但是,只有当 word app 失去焦点时(如 msdn 所述),打开的 Word 应用程序才会在运行对象表中注册。如果我有流程,如何在 ROT 中手动注册 word application?下面的一些伪代码

//process started
private void ProcessStarted(object sender, EventArrivedEventArgs e)
{
     // Marshal.GetActiveObject fails since there is no object yet.
     // Process.GetProcessesByName("WINWORD") got it.
     // now how to register this word process to ROT?
     // so that I have a global instance of word application?
}

注意:我可以通过一些繁重的 API 调用以编程方式将焦点从打开的单词窗口中移开,然后将其带回来,但这完全是一团糟。

有什么正规的注册方式吗?

4

1 回答 1

1

据我所知,如果没有直接合作,就无法在 ROT 中注册另一个应用程序的对象。该表不跟踪进程,它跟踪类工厂及其关联的名字对象。为了在 ROT 中注册一些东西,你需要它的 IUnknown 指针,这不是你要直接从 Word 中得到的东西。

于 2012-02-29T02:10:20.843 回答