OLE Automation для запуска MS Word и вывода на передний план - PullRequest
3 голосов
/ 05 октября 2010

Каков «правильный» (рекомендуемый) метод для подключения к работающему экземпляру 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 Ответ

2 голосов
/ 09 октября 2010

Word (и Excel в этом отношении) зарегистрирует ТОЛЬКО ПЕРВУЮ ИНСТАНЦИЮ, которая загружается в ROT (Таблица запущенных объектов).

ROT - это то, где GETOBJECT «получает объект», поэтому в некоторых случаяхВ силу обстоятельств можно загрузить два экземпляра WinWord.exe, один видимый, а другой нет, но невидимый экземпляр - это тот, который зарегистрирован в ROT, а видимый - НЕ.

Это поможет вамповедение, которое вы видите.

К сожалению, без каких-либо вызовов API для перечисления всех открытых окон в системе вы всегда рискуете, что GETOBJECT не даст вам объект, который вы ожидаете от него.

Существует не так уж много способов обойти это.

Кроме того, ваша конечная цель в любом случае немного подозрительна.

Когда вы говорите "Что такое" правильно«способ подключения к работающему экземпляру MS Word и переноса этого приложения на передний план?», что произойдет, если загружено 2 или более реальных экземпляров Winword.exe?

Что бы вы хотелиМуравей «подключиться» и принести на фронт.В любом случае, это бросок костей, если вы не заинтересованы в том, чтобы открылось конкретное окно ДОКУМЕНТА.

Из того, что я понимаю, Word будет регистрировать ВСЕ окна документов в ROT, независимо от того, какой экземпляр Winword этоесть, так что вы можете теоретически использовать Getobject для извлечения конкретного ДОКУМЕНТА, получить объект APPLICATION из объекта DOCUMENT и затем сделать его ВИДИМЫМ с НОРМАЛЬНЫМ состоянием окна.

Вот пример GetObject для документа

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

...