Message Box Button Texte ändern

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Moefab.

    Message Box Button Texte ändern

    HI Community,

    ich habe folgendes Problem:
    Ich möchte die API meiner Message Box überschreiben, damit ich die Beschriftung der Buttons umbenennen kann. Yes/No etc. ist mir zu wenig.

    Da es schnell gehen musste habe ich vorrübergehend eine extra Form angelegt die wie meine Message Box aussieht und auch Ihren Zweck erfüllt. Aber ich finde das schlampig und außerdem muss ich dadurch viele Parameter an die andere Form übergeben.

    Habe mich im Netz ein bisschen schlau gemacht und was von Hooks gehört und von überschreiben der API aber kein konkretes Beispiel gefunden.

    Danach habe ich mich selbst versucht und bereits in der ersten Zeile einen Fehler bekommen.

    VB.NET-Quellcode

    1. Inherits System.Windows.Forms.MessageBox

    Die System.Windows.Forms.MessageBox-Klasse hat kein zugreifbares "Sub New" und kann nicht geerbt werden.

    Bitte um Hilfe wie ich fortfahren kann.

    Vielen dank
    Moefab
    Das Problem hatte ich auch mal. ich habe es gelöst in dem ich von:

    VB.NET-Quellcode

    1. Inherits System.Windows.Forms.MessageBox
    2. public Class Form1
    3. 'mein Code
    4. End Class


    auf:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Inherits System.Windows.Forms.MessageBox
    3. 'mein Code
    4. End CLass


    umgestiegen bin. Zudem solltest du noch die passenden Verweise setzen. Ich nehme mal an dass das von dem Krypton-Toolkit kommt. Folglich müsstest du die ersten zwei Verweise hinzufügen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „powerprogger“ ()

    @powerprogger:

    Mein Verweis war schon in der Klasse sorry das ich das nicht mit hingemacht habe. Also so sieht das aus. Und da kommt der oben beschreibene Fehler.

    VB.NET-Quellcode

    1. Public Class BlaBla
    2. Inherits System.Windows.Forms.MessageBox
    3. End Class


    Was ist Krypton Toolkit muss ich doch mal google fragen :)

    @mikeb69: Ja ich werde das auch erstmal so lassen und mich mit dem überschreiben der API ausführlicher auseinandersetzen und das im nachhinein ändern. Falls ich einen Möglichkeit gefunden habe die Beschriftung zu ändern werde ich es euch mitteilen.

    LG - Moefab
    Der Verweis: System.Windows.Forms (Typ .NET, Version 2.0.0.0) ist gesetzt.
    Du sprichst von Mehrzahl welcher fehlt dann noch?
    ich bin alle Verweise nun mal durch gegangen aber finde keinen der Explizit auf MsgBox hinweist. :(
    wenn du es so genau machen möchtest, erstelle dir doch deine eigene MessageBox! doch du weisst, eine MessageBox kann man auch mit anderen parametern als vbyes, oder vbno öffnen! doch wenn die dir auch zu wenig sind, würde ich eine eigene messagebox erstellen!
    Habe nun dazu was gefunden. Quelle: programmersheaven.com/mb/VBNET…5/276485/ReadMessage.aspx

    Folgenden Code in eine Klasse einfügen:

    VB.NET-Quellcode

    1. Public Class CustomMessageBoxAPI
    2. Dim WH_CBT As Integer = 5
    3. Dim HCBT_ACTIVATE As Integer = 5
    4. Dim hHook As Integer
    5. Dim MB_YESNO As Integer = &H4
    6. Dim MB_ICONINFORMATION As Integer = &H40
    7. Dim MB_TASKMODAL As Integer = &H2000
    8. Public Shared IDYES As Integer = 6
    9. Public Shared IDNO As Integer = 7
    10. Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" _
    11. (ByVal hwnd As Integer, _
    12. ByVal lpText As String, _
    13. ByVal lpCaption As String, _
    14. ByVal wType As Integer) As Integer
    15. Private Declare Function SetDlgItemText Lib "user32" Alias "SetDlgItemTextA" _
    16. (ByVal hDlg As Integer, _
    17. ByVal nIDDlgItem As Integer, _
    18. ByVal lpString As String) As Integer
    19. Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
    20. (ByVal idHook As Integer, _
    21. ByVal lpfn As CallBack, _
    22. ByVal hmod As Integer, _
    23. ByVal dwThreadId As Integer) As Integer
    24. Private Declare Function UnhookWindowsHookEx Lib "user32" Alias "UnhookWindowsHookEx" _
    25. (ByVal hHook As Integer) As Integer
    26. Private Delegate Function CallBack( _
    27. ByVal uMsg As Integer, _
    28. ByVal wParam As Integer, _
    29. ByVal lParam As Integer) As Integer
    30. Public Function MyMessageBox(ByVal hWnd As Integer) As Integer
    31. hHook = SetWindowsHookEx(WH_CBT, AddressOf MsgBoxHookProc, 0, AppDomain.GetCurrentThreadId())
    32. Return MessageBox(hWnd, "Prompt", "Caption", MB_YESNO Or MB_ICONINFORMATION Or MB_TASKMODAL)
    33. End Function
    34. Private Function MsgBoxHookProc(ByVal uMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    35. If uMsg = HCBT_ACTIVATE Then
    36. SetDlgItemText(wParam, IDYES, "Mein Text")
    37. SetDlgItemText(wParam, IDNO, "Mein Text2")
    38. UnhookWindowsHookEx(hHook)
    39. End If
    40. End Function
    41. End Class


    In Zeile 44 und 45 werden nun die neuen Beschriftungen an die Buttons übergeben.

    Um die neue Message Box aufzurufen folgenden Code dort einsetzen wo die MsgBox aufgerufen werden soll

    VB.NET-Quellcode

    1. Dim mb As New Class1.CustomMessageBoxAPI()
    2. mb.MyMessageBox(0)


    Der Dialog Result wird dann wie folgt gehandhabt
    Hier in diesem Beispiel werden nun Strings an Textboxen übergeben beim Dialog Result, können natürlich jegliche Anweisungen sein.

    VB.NET-Quellcode

    1. Dim mb As New Class1.CustomMessageBoxAPI()
    2. Select Case mb.MyMessageBox(0)
    3. Case Class1.CustomMessageBoxAPI.IDYES : TextBox1.Text = "Du hast den linken Knopf gedrückt"
    4. Case Class1.CustomMessageBoxAPI.IDNO : TextBox1.Text = "Du hast den rechten Knopf gedrückt"
    5. End Select


    Ich denke von dem Standpunkt aus lässt sich gut weiterarbeiten.

    MFG - Moefab