2012-02-29 52 views
2

这是可能的重复。找不到确切的一个,我记得经历了很久很久以前。如何以编程方式在运行对象表中注册Word实例?

该工具需要能够检测是否有任何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来获得运行实例。但是,只有当单词app失去焦点时(如msdn所记录),才会在运行的对象表中注册一个打开的Word应用程序。如果我有与我在一起的流程,如何手动在ROT中注册Word应用程序?下面

//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窗口离开,然后把它带回来,但那是一塌糊涂。

任何正常的注册方式?

+0

所以没有解决这个问题?你可以发布你正在使用的其他选择吗? – 2017-12-18 05:59:32

+0

@AniketBhansali对不起,我现在不记得:( – nawfal 2017-12-18 06:03:44

回答

1

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

相关问题