1

これは重複の可能性があります。正確なものを見つけることができませんでした。かなり前に経験したことを覚えています。

このツールには、コンピューターから任意の場所で 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呼び出しを使用して、開いている単語ウィンドウからプログラムでフォーカスを強制的に離してから戻すことができますが、それは完全な混乱です。

通常の登録方法はありますか?

4

1 に答える 1

1

私の知る限り、別のアプリケーションのオブジェクトを ROT に登録する方法は、直接の協力なしではありません。このテーブルはプロセスを追跡するのではなく、クラス ファクトリとそれに関連付けられたモニカを追跡します。ROT に何かを登録するには、その IUnknown ポインターが必要です。これは、Word から直接取得するものではありません。

于 2012-02-29T02:10:20.843 に答える