これは重複の可能性があります。正確なものを見つけることができませんでした。かなり前に経験したことを覚えています。
このツールには、コンピューターから任意の場所で 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 アプリケーションは、実行中のオブジェクト テーブルに登録されるのは、単語アプリがフォーカスを失った場合のみです (msdn で文書化されているように)。プロセスがある場合、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呼び出しを使用して、開いている単語ウィンドウからプログラムでフォーカスを強制的に離してから戻すことができますが、それは完全な混乱です。
通常の登録方法はありますか?