Как я могу управлять прибором "msgbox" в VB. сеть
Могу ли я показать пользовательские кнопки внутри MsgBox? Мне нужны разные кнопки от обычных кнопок для msgbox, которые являются:
- ОК
- отмена
- прервать
- повторите попытку
- игнорировать
- Да
- Нет
Как я могу управлять текстом и значением этих кнопок?
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 не знаю... я только что нашел этот путь... очень хорошо и легко.