توماس یک ماکرو دارد که عملکردهای مختلفی را در فواصل زمانی مشخص انجام می دهد. اگر کادر محاورهای روی صفحه باز باشد، برخی از آن عملکردها نباید انجام شوند، زیرا تلاش برای انجام آنها باعث ایجاد خطا در عملکردها میشود. او متعجب است که آیا راهی وجود دارد، در ماکرو، تا تشخیص دهد که آیا یک جعبه محاوره ای - هر جعبه محاوره ای - در حال حاضر باز است یا خیر. توماس ترجیح میدهد کادر محاورهای باز را تشخیص دهد تا اینکه با خطای ایجاد شده مقابله کند.
شاید تنها راه برای انجام این کار استفاده از FindWindow باشد که در واقع بخشی از API ویندوز است. هدف آن بازیابی یک دسته در یک پنجره باز خاص است. (یک کادر محاوره ای چیزی جز یک پنجره باز نیست و هر کادر محاوره ای یک نام دارد.) این رویکرد به شما نمی گوید که آیا
any
کادر محاوره ای باز است، اما به شما می گوید که آیا a
specific
کادر محاوره ای باز است
در اینجا یک مثال سریع برای نشان دادن نحوه استفاده از تابع 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 را برمی گرداند.
همچنین به یاد داشته باشید که جعبه های محاوره ای می توانند دو نوع باشند: مودال و غیر مودال. اگر یک کادر محاورهای خاص مودال باشد، باید قبل از انجام هر گونه اقدام دیگری در سیستم، آن را رد کرد. میخواهید آزمایشهای گستردهای را با جعبههای محاورهای انجام دهید، زیرا ممکن است بسته به اینکه یک کادر محاورهای باز مودال باشد یا نه، عملکرد متفاوتی از ماکرو خود دریافت کنید.