如何在运行对象表中以编程方式注册Word实例

本文关键字:方式 编程 注册 Word 实例 运行 对象 | 更新日期: 2023-09-27 18:26:01

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

该工具需要能够检测是否有任何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应用程序失去焦点时(如msdn所述),打开的Word应用程序才会在运行对象表中注册。如果我有流程,我如何在ROT中手动注册单词应用程序?以下的一些伪代码

//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调用,通过编程将焦点从打开的单词窗口中移开,然后将其带回,但这完全是一团糟。

有正常的注册方式吗?

如何在运行对象表中以编程方式注册Word实例

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