У Томаса есть макрос, который выполняет различные функции через определенные промежутки времени.

Некоторые из этих функций не следует выполнять, если на экране открыто диалоговое окно, поскольку попытка их выполнения вызовет ошибку в функциях. Он задается вопросом, есть ли в макросе какой-либо способ определить, открыто ли в настоящее время диалоговое окно — любое диалоговое окно. Томас предпочел бы обнаружить открытое диалоговое окно, а не обрабатывать сгенерированную ошибку.

Возможно, единственный способ сделать это — использовать FindWindow, который фактически является частью Windows API. Его цель — получить дескриптор конкретного открытого окна. (Диалоговое окно — это не что иное, как открытое окно, и каждое диалоговое окно имеет имя.) При таком подходе вы не узнаете, открыто ли _ любое_ диалоговое окно, но сообщит вам, открыто ли секретное диалоговое окно.

Вот краткий пример, показывающий, как можно использовать функцию FindWindow:

Declare Function FindWindow Lib "user32" Alias "FindWindowA" _   (ByVal wClassName As Any, ByVal wWindowName As String) As Long

Sub testDialogOpen()

Dim wHandle As Long     Dim wName As String

wName = "Find and Replace"

wHandle = FindWindow(0&, wName)

If wHandle = 0 Then         MsgBox "Dialog window is not open"

Else         MsgBox "Dialog window is open"

End If End Sub

Обратите внимание, что функцию FindWindow необходимо объявить вне процедуры VBA. Затем в рамках процедуры вам нужно указать имя диалогового окна, о котором вы хотите узнать. Это имя, которое появляется в строке заголовка диалогового окна, а функция FindWindow не чувствительна к регистру. Возвращаемое значение для FindWindow будет дескриптором диалогового окна, если оно открыто. Если он не открыт, функция возвращает 0.

Помните также, что диалоговые окна могут быть двух типов: модальные и немодальные. Если конкретное диалоговое окно является модальным, его необходимо закрыть, прежде чем любые другие действия можно будет предпринять в системе. Вы захотите провести обширное тестирование диалоговых окон на данном этапе, так как вы можете получить разную производительность от вашего макроса в зависимости от того, является ли открытое диалоговое окно модальным или нет.

_Примечание: _

Если вы хотите знать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах WordTips), я подготовил специальную страницу, содержащую полезную информацию.

link: / wordribbon-WordTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

WordTips — ваш источник экономичного обучения работе с Microsoft Word.

(Microsoft Word — самая популярная программа для обработки текстов в мире.) Этот совет (12355) применим к Microsoft Word 97, 2000, 2002 и 2003. Вы можете найти версию этого совета для ленточного интерфейса Word (Word 2007 и позже) здесь:

link: / wordribbon-Detecting_an_Open_Dialog_Box [Обнаружение открытого диалогового окна].