这是一个可能的重复。找不到确切的,我记得很久以前经历过一个。
该工具需要能够检测是否从计算机的任何位置打开了任何 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 调用以编程方式将焦点从打开的单词窗口中移开,然后将其带回来,但这完全是一团糟。
有什么正规的注册方式吗?