4

MS Word の実行中のインスタンスに接続し、このアプリケーションを前面に表示するための "正しい" (推奨される) 方法は何ですか? 私はVBAアプリから次のようなことをしています:

...
objWord = GetObject ("Word.Application")
if (objWord is nothing) then
  objWord = CreateObject("Word.Application")
end if
objWord.Activate()
objWord.Visible = true
objWord.WindowState = 1 'maximized
...

Windows XP で Word 2007 を実行すると、これはほとんどの場合機能しますが、定期的に Word ウィンドウを前面に表示できません (代わりに、タスク バーの Word の最小化されたアイコンが点滅します)。

: FindWindow Win API 呼び出しを使用して、この問題を部分的に解決しました。

hwnd = FindWindow("OpusApp", vbNullString)
If hwnd > 0 Then 
  SetForegroundWindow (hwnd)
end if

これは 100% ではありません。なぜなら (drventure が指摘したように)、Word の複数のインスタンスが実行されている場合、どれにハンドルを取得するかを特定できないからです。私のコードが Word を起動すると、最初に GetObject が使用され、それが失敗した場合は CreateObject が使用されるため、最初に実行されている Word のインスタンスが 1 つある限り、問題ありません。

4

1 に答える 1

2

Word (および Excel) は、ROT (実行中のオブジェクト テーブル) に読み込まれる VERY FIRST INSTANCE のみを登録します。

ROT は GETOBJECT が「オブジェクトを取得する」場所であるため、特定の状況では、WinWord.exe の 2 つのインスタンスをロードすることが可能です。 1つはそうではありません。

これにより、表示されている動作が得られます。

残念ながら、システムで開いているすべてのウィンドウを列挙するための API 呼び出しがないと、GETOBJECT が期待するオブジェクトを取得できないというリスクが常に発生します。

これを回避する方法はあまりありません。

その上、あなたの最終目標はとにかく少し疑わしいです。

「実行中の MS Word のインスタンスに接続し、このアプリケーションを前面に表示するための "正しい" 方法は何ですか?」と言うとき、Winword.exe の実際のインスタンスが 2 つ以上読み込まれている場合はどうなりますか?

どちらに「接続」して前面に出したいですか。開いている特定の DOCUMENT ウィンドウに特に関心がある場合を除き、とにかくサイコロを振るだけです。

私が理解していることから、Winword のインスタンスに関係なく、Word はすべてのドキュメント ウィンドウを ROT に登録するため、理論的には Getobject を使用して特定のドキュメントを取得し、DOCUMENT オブジェクトから APPLICATION オブジェクトを取得して、それを VISIBLE にすることができます。通常のウィンドウ状態。

ドキュメントの GetObject の例を次に示します。

http://support.microsoft.com/kb/307216

于 2010-10-08T20:27:36.607 に答える