2009-07-16 4 views

ответ

1

Возможно, я ошибаюсь, но MsgBox - это блокирующий вызов, создающий модальную форму, поэтому я не думаю, что есть простой способ, такой как вариант сделать это. У вас есть конкретный прецедент для этого?

+0

Я не знаю, где находится окно сообщения, я не хочу анализировать, откуда оно взялось. Я хочу KILLLLLL :-) – 2009-07-16 18:06:57

+4

Если вы хотите узнать, где находится окно сообщения, просто нажмите «Ctrl + Break», чтобы узнать, что вызывает это, и прокомментировать звонок. Если это ложь третьей стороны, то, если нет какого-либо свойства, чтобы заставить ее «молчать», вы, вероятно, ничего не сможете сделать. –

+1

Это может быть также родной MsgBox Access, вызванный тем, что вы сделанный. Если это так, может быть альтернативный способ сделать доступ «тихим» – MarkJ

6

Заканчивать ответ Рэнди Берч на this нить в microsoft.public.vb.general.discussion

Он рекомендует создать функцию в файле с именем .BAS MsgBox. Это приведет к тому, что VB вызовет вашу функцию, а не встроенную.

Тогда вы создали бы свою собственную форму MsgBox и создали бы таймер, чтобы закрыть форму после определенного периода времени. Он предоставляет ссылки, показывающие, как это сделать.

Он также обсуждает способ явного вызова встроенной функции MsgBox на случай, если вам это нужно.

Примечание: Я никогда не делал этого, но я обнаружил, что Рэнди Берч - это хорошо осведомленный ресурс.

+1

Это будет работать, только если MsgBox отображается из вашего собственного кода. Если это родной MsgBox Access, вам понадобится другой подход. – MarkJ

+0

Вы можете подключить к нему приложение msgbox другого приложения и закрыть его. Вы узнаете о перехватах и ​​msgbox из ресурса выше. Я должен был сделать это 1000 раз и провел несколько недель, проживая на его сайте. :) Избегайте прикосновений, подобных чуме. С пользователем в системе это, по крайней мере, не поддается описанию того, какое приложение будет получать нажатие клавиши. – Praesagus

1

MsgBoxes не предназначены для программной защиты, поэтому это сложно сделать. Если вы окажетесь в дизайне, где вы должны заставить закрыть MsgBox, вы, вероятно, должны переоценить свой дизайн.

0

Вместо того, чтобы писать альтернативу Access MsgBox с нуля, вы можете рассмотреть возможность использования (или, по крайней мере, изучения) пользовательского создателя MessageBox от Arvin Meyer (можно загрузить на this page).

1

Как отмечает MarkJ, могло ли это быть диалоговое окно, созданное Access (а не VBA.MsgBox, вызванное вашим собственным кодом)?

Например, при использовании таблицы «dataview» в пользовательском интерфейсе доступа для добавления строки вы получаете сообщение «Вы собираетесь добавить 1 запись ...» (или подобное). Это то, что вы имеете в виду? Если это так, есть способы их подавления ...

0

У меня есть аналогичная проблема, и теоретически вы можете использовать функцию «SendKeys» (см. http://msdn.microsoft.com/en-us/library/8c6yea83%28VS.85%29.aspx). Однако MsgBox блокирует запуск, поэтому вы не можете использовать команду. Если вы знаете, когда он появится, вы можете запустить (из скрипта) внешний whshell, который будет ждать некоторое время, а затем использовать SendKeys. Но если вы знаете, как это сделать, скажите мне (здесь). Другая аналогичная возможность заключается в том, чтобы открыть для него различные потоки/процессы, которые не будут блокироваться, но я не знаю, возможно ли это в VBA.

Одед

0

Коробки сообщений являются Мент, чтобы изобразить некоторую информацию пользователю. Следовательно, программное закрытие не является хорошим дизайном, если вы не автоматизируете какой-либо процесс.

Вы можете использовать sendkeys или win APIs.

Спасибо, pkrg

1

Я использовал, чтобы иметь простой ответ на этот вопрос: использовать объект Windows Scripting Shell, которая имеет функцию «Popup» - окно с сообщением, так же, как в VBA MsgBox() функция, с параметром «SecondsToWait», который обеспечивает точно необходимый тайм-аут.

With CreateObject("Scripting.WsShell") 
    .Popup "Watch me disappear in 5 seconds", 5, Application.Name & ": test", vbInformation + vbOkCancel 
End With 

Если включить кнопку 'Отмена', он может работать: доступные параметры vbOkCancel, vbYesNoCancel и vbRetryCancel.

Если вы пытаетесь закрыть диалоговое окно, которое вы не инициировали со своим вызовом функции msgBox(), это бесполезно: и, как я уже сказал, параметр «SecondsToWait» на самом деле не работает в наши дни - кому-то в Редмонде действительно не нравится идея одного потока, закрывающего полезные предупреждения и важные перерывы в рабочем процессе пользователя.

Однако, вы можете запустить замедленное Message Box «Закрыть» команду с помощью API-Timer() функция - не совсем «закрыть открыт в настоящее время MsgBox», так как это требует предварительного предупреждения, что вы хотели, чтобы открыть его, - но это самое близкое, что у меня есть, оно вписывается в автономный модуль VBA и I posted the code in an answer to a very similar StackOverflow question to yours.

Я должен предупредить вас, что данный ответ использует кувалду, чтобы взломать орех, с порядком длинного объяснения.