Прослушивание результатов MessageBox и Dialog в моем приложении - PullRequest
4 голосов
/ 01 февраля 2011

У меня есть класс «ControlMonitor», который предназначен для прослушивания событий, которые происходят в форме.Это работает так: я передаю форму, которую хочу отслеживать, в экземпляр этого класса, а затем класс перебирает все элементы управления формы и регистрирует их «соответствующие» события.Например, если элементом управления является TextBox, я регистрируюсь для TextChanged.Если элемент управления является ComboBox, я регистрируюсь как для SelectedIndexChanged и TextChanged, и так далее.Таким образом, экземпляр «ControlMonitor» может отчитываться о каждом значительном действии, которое пользователь совершил в моей форме, с минимальным вмешательством в сам код формы.

Он отлично работает для создания отчетов по любым элементам управленияв форме, но мне также нужно знать, какие общие диалоговые окна / окна сообщений были запущены в форме и как пользователь ответил на них.Я должен отметить, что более важной целью здесь является автоматизация: мы хотим получить набор повторяющихся шагов, которые можно записать в сценарий, который воспроизводится в инструменте автоматизации.Для этого недостаточно знать, что пользователь нажал «Файл / Открыть»;нам также нужно знать заголовок окна запущенного OpenFileDialog, путь, который выбрал пользователь, и DialogResult.То же самое касается вызовов MessageBox;нам нужно знать заголовок окна и DialogResult.

Кажется, что общие диалоги имеют минимальную поддержку событий (очевидно, что FolderBrowserDialog вообще не имеет событий), и я даже не уверен, с чего начать, когдаречь идет о прослушивании результатов вызова MessageBox.Конечно, я мог бы написать класс-обертку, который инкапсулирует общие диалоги и вызовы MessageBox и передает результаты в экземпляр «ControlMonitor» ... но тогда остальная часть программы должна будет постоянно использовать этот класс-обертку, и первичныйЦель моего класса «ControlMonitor» состоит в том, чтобы вы могли включить его в проект и прослушать одну из форм с минимальным вмешательством в исходный код.

Могу ли я что-нибудь сделать в классе «ControlMonitor»?Мне нужны DialogResults и заголовки окон для всех диалогов / окон сообщений, а также для более сложных диалогов, таких как OpenFileDialog. Мне также нужно знать путь, выбранный пользователем и т. Д. Класс «ControlMonitor» является скомпилированной частью программы, которую он пытается прослушать.к, поэтому он имеет прямой доступ к объекту Form, который передается в него.Я так близко здесь;Я могу контролировать 95% приложений, потому что большинство из них - это просто элементы управления в форме ... Мне также нужен способ контролировать диалоги!

Ответы [ 2 ]

1 голос
/ 23 февраля 2011

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

Блок приложения Composite UI , выпущенный Microsoft, имеет примерный брокер событий, но также не так много усилий, чтобы написать свой собственный. Суть идеи в том, что у вас есть центральный брокер, которому ваши элементы управления публикуют события. Тогда любой другой класс может подписаться на любое из этих событий. Это делает события публикации / подписки слабо связанными и устраняет сильные зависимости между различными элементами управления.

0 голосов
/ 01 февраля 2011

Я решил похожую проблему, просто создав функцию-оболочку для вызовов MessageBox.Show (), а затем заменив все вызовы в нашем приложении на эту функцию.

что-то похожее на:

Public Function My_MessageBox(ByVal pstrMsg As String, _
    Optional ByVal pstrCaption As String = "", _
    Optional ByVal pButtons As Windows.Forms.MessageBoxButtons = MessageBoxButtons.OK, _
    Optional ByVal pIcon As Windows.Forms.MessageBoxIcon = MessageBoxIcon.None, _
    Optional ByVal pDefButton As Windows.Forms.MessageBoxDefaultButton = MessageBoxDefaultButton.Button1) _
    As Windows.Forms.DialogResult

    Dim rval As Windows.Forms.DialogResult

    If glAutomated Then
        ' if automation is running, we don't want to show 
        ' the box to the user, just retrieve the result stored
        rval = AutomateThisMessageBox("MsgBox" & pstrCaption.Replace(" ", ""))
    Else
        rval = MessageBox.Show(pstrMsg, pstrCaption, pButtons, pIcon, pDefButton)

        If glRecording Then 'Only record the result when in "record" mode
            Hooks.RecordMessageBox(pstrCaption.Replace(" ", ""), rval.ToString)
        End If
    End If

    Return rval

End Function

Использование: точно так же, как Messagebox.Show в настоящее время используется, просто подставьте в новую функцию Name например:

MessageBox.Show("This is a test", "Test Msg", 
    MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk, 
    MessageBoxDefaultButton.Button1)

становится

My_MessageBox("This is a test", "Test Msg", 
    MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk, 
    MessageBoxDefaultButton.Button1)

Изменить:

Просто перечитайте в конце вашего вопроса обо всех различных диалогах. Я предполагаю, что подобную технику можно использовать в общем смысле. Или разные обертки для всех необходимых вам диалогов (открытие файла / etc)

...