Как я могу управлять прибором "msgbox" в VB. сеть


Могу ли я показать пользовательские кнопки внутри MsgBox? Мне нужны разные кнопки от обычных кнопок для msgbox, которые являются:

  1. ОК
  2. отмена
  3. прервать
  4. повторите попытку
  5. игнорировать
  6. Да
  7. Нет

Как я могу управлять текстом и значением этих кнопок?

3 2

3 ответа:

Нет, MsgBox напрямую связан с базовым пользовательским интерфейсом Windows и не может быть легко изменен или расширен.
Вы должны создать свой собственный класс или искать уже сделанный проект, как этот

Универсальная замена MessageBox

Ну, небольшое исследование на эту тему привело меня к этой старой статье и Кодексу

Использование Windows Hooks для улучшения MessageBox в .NET

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

Вы можете изменить окно сообщения, но там будут ограничения. Максимальное количество кнопок-3. Текст кнопок может быть изменен.

Добавьте в свой проект следующий класс, который поможет вам изменить текст кнопок.

Imports System.Text
Imports System.Windows.Forms

Public Class MessageClass

Private Shared mLabels() As String    '' Desired new labels
Private Shared mLabelIndex As Integer '' Next caption to update

Public Shared Sub PatchMsgBox(ByVal labels() As String)
    ''--- Updates message box buttons
    mLabels = labels
    Application.OpenForms(0).BeginInvoke(New FindWindowDelegate(AddressOf FindMsgBox), GetCurrentThreadId())
End Sub

Private Shared Sub FindMsgBox(ByVal tid As Integer)
    ''--- Enumerate the windows owned by the UI thread
    EnumThreadWindows(tid, AddressOf EnumWindow, IntPtr.Zero)
End Sub

Private Shared Function EnumWindow(ByVal hWnd As IntPtr, ByVal lp As IntPtr) As Boolean
    ''--- Is this the message box?
    Dim sb As New StringBuilder(256)
    GetClassName(hWnd, sb, sb.Capacity)
    If sb.ToString() <> "#32770" Then Return True
    ''--- Got it, now find the buttons
    mLabelIndex = 0
    EnumChildWindows(hWnd, AddressOf FindButtons, IntPtr.Zero)
    Return False
End Function

Private Shared Function FindButtons(ByVal hWnd As IntPtr, ByVal lp As IntPtr) As Boolean
    Dim sb As New StringBuilder(256)
    GetClassName(hWnd, sb, sb.Capacity)
    If sb.ToString() = "Button" And mLabelIndex <= UBound(mLabels) Then
        ''--- Got one, update text
        SetWindowText(hWnd, mLabels(mLabelIndex))
        mLabelIndex += 1
    End If
    Return True
End Function

''--- P/Invoke declarations
Private Delegate Sub FindWindowDelegate(ByVal tid As Integer)
Private Delegate Function EnumWindowDelegate(ByVal hWnd As IntPtr, ByVal lp As IntPtr) As Boolean
Private Declare Auto Function EnumThreadWindows Lib "user32.dll" (ByVal tid As Integer, ByVal callback As EnumWindowDelegate, ByVal lp As IntPtr) As Boolean
Private Declare Auto Function EnumChildWindows Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal callback As EnumWindowDelegate, ByVal lp As IntPtr) As Boolean
Private Declare Auto Function GetClassName Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal name As StringBuilder, ByVal maxlen As Integer) As Integer
Private Declare Auto Function GetCurrentThreadId Lib "kernel32.dll" () As Integer
Private Declare Auto Function SetWindowText Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal text As String) As Boolean

End Class

Теперь используйте класс следующим образом, чтобы показать сообщения:

MessageClass.PatchMsgBox(New String() {"Button name 1", "Button name 2"})
Dim Result As DialogResult = MsgBox("Message", MsgBoxStyle.OkCancel, "Title")

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

Я нашел способ сделать это, и это прекрасно работает для меня.

Я создал новую форму, и я делаю ее похожей на "msgbox", и я добавляю к ней то, что мне нужно, например кнопки, картинки... и все остальное, но когда мне нужно показать форму (msgbox)... я использую этот код:
Form1.showDialog()

Вместо записи: Form1.Show()

Вы можете сделать его похожим на "msgbox" с пользовательскими кнопками, и вы не можете ничего сделать в других открытых окнах, чтобы закрыть эту форму (точно так же, как "msgbox").

I не знаю... я только что нашел этот путь... очень хорошо и легко.