Как «восстановить» окно документа MS Word с помощью автоматизации

Я хотел бы иметь возможность «восстановить» окно документа MS Word с помощью автоматизации.

У меня уже есть объект приложения, и я попытался вызвать App.Activate. Активировать переместит окно на вершину стека окон, но не в том случае, если Word свернут. Я могу установить для WindowState значения Maximized, Minimized и Normal, но мне действительно нужно восстановить окно в состояние, в котором оно было до того, как пользователь свернул его (это было бы эквивалентно нажатию пользователем кнопки приложения на панели задач) .

Возможно ли это с помощью автоматизации Word?

На самом деле я использую C++ для автоматизации, поэтому при необходимости могу вызывать функции Win32 API.

Если нет прямого способа восстановить окно, возникает вопрос: «Как я могу получить дескриптор окна ActiveWindow?»


person jmatthias    schedule 11.06.2009    source источник


Ответы (2)


Попробуйте ::ShowWindow(handle, SW_RESTORE)

person Assaf Lavie    schedule 11.06.2009
comment
Я думал об этом подходе, но объектная модель, похоже, не дает способа получить дескриптор окна, который мне понадобится для вызова ::ShowWindow() - person jmatthias; 11.06.2009

Лучший способ, который я придумал до сих пор, заключается в следующем.

Получить активное окно с помощью Application.ActiveWindow

Этот объект окна имеет свойство Caption. Заголовок отображается в заголовке окна документа.

Затем я использую функцию Win32 EnumWindows() для поиска окна Win32. Я получаю текст окна для каждого окна, возвращаемого EnumWindows(), используя функцию Win32 GetWindowText(). Я пытаюсь найти заголовок в тексте окна и в качестве дополнительной проверки убеждаюсь, что текст окна также содержит строку «Microsoft Word».

Как только я нахожу окно, у меня есть дескриптор окна Win32, который я затем могу передать функции Win32 ShowWindow(hWnd, SW_RESTORE).

Вы также должны вызвать Application.Activate.

Это решение не идеально, например, мне не очень нравится предполагать, что заголовок окна всегда будет содержать текст «Microsoft Word», но я также не хочу выбирать неправильное окно.

person jmatthias    schedule 12.06.2009
comment
Вам лучше использовать EnumWindows(), но затем для каждого окна вызывать GetClassName, а затем проверять имя класса OpusApp, которое идентифицирует его как окно Word. - person Nick; 20.11.2009