Как программно зарегистрировать экземпляр 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
чтобы получить работающий экземпляр. Но открытое приложение Word регистрируется в таблице запущенных объектов только в том случае, если приложение word теряет фокус (как задокументировано msdn). Как мне вручную зарегистрировать слово application в 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 программным образом отвести фокус от открытого окна слова и затем вернуть его обратно, но это полный беспорядок.
Любой нормальный способ регистрации?
1 ответ
Насколько я знаю, невозможно зарегистрировать объекты другого приложения в ROT без его прямого взаимодействия. Таблица не отслеживает процессы, она отслеживает фабрики классов и связанные с ними названия. Чтобы что-то зарегистрировать в ROT, вам нужен указатель IUnknown, который вы не получите напрямую от Word.