Как программно зарегистрировать экземпляр Word в таблице запущенных объектов? - PullRequest
1 голос
/ 29 февраля 2012

Это возможный дубликат.Не могу найти точный, я помню, как проходил один такой давний период.

Инструменту нужна возможность обнаружить, открыт ли какой-либо файл 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).Как мне вручную зарегистрировать приложение 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 программным образом отвести фокус от открытого окна слова и затем вернуть его обратно, но это полный беспорядок.

Любой нормальный способ регистрации?

1 Ответ

1 голос
/ 29 февраля 2012

Насколько я знаю, невозможно зарегистрировать объекты другого приложения в ROT без его прямого взаимодействия. Таблица не отслеживает процессы, она отслеживает фабрики классов и связанные с ними имена. Чтобы что-то зарегистрировать в ROT, вам нужен указатель IUnknown, который вы не получите напрямую от Word.

...