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