X-Dialog schließen unterbinden

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    @jan99 Hab ich als C#-Code vorrätig, ist aber elementar einfach nach VB zu übersetzen:
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Runtime.InteropServices;
    3. namespace MyService
    4. {
    5. /// <summary>
    6. /// Methoden zur Anpassung des Erscheinungsbildes eines Dialogs:
    7. /// Disablen des [X]-FormClose-Buttons
    8. /// </summary>
    9. internal static class NativeMethods
    10. {
    11. private const int MF_BYCOMMAND = 0x00000000;
    12. private const int SC_CLOSE = 0xF060;
    13. [DllImport("user32.dll")]
    14. private static extern int DeleteMenu(IntPtr hMenu, int nPosition, int wFlags);
    15. [DllImport("user32.dll")]
    16. private static extern IntPtr GetSystemMenu(IntPtr hWnd, [MarshalAs(UnmanagedType.Bool)] bool bRevert);
    17. /// <summary>
    18. /// Disablen des [X]-FormClose-Buttons
    19. /// </summary>
    20. /// <param name="hWnd"></param>
    21. internal static void DeleteSysMenu(IntPtr hWnd)
    22. {
    23. IntPtr menu = NativeMethods.GetSystemMenu(hWnd, false);
    24. NativeMethods.DeleteMenu(menu, NativeMethods.SC_CLOSE, NativeMethods.MF_BYCOMMAND);
    25. }
    26. }
    27. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Moin!

    erst einmal Danke - habe das durch den Code-Converter geschickt und dabei ist folgendes rausgekommen.

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Runtime.InteropServices
    3. Namespace MyService
    4. Friend Module NativeMethods
    5. Private Const MF_BYCOMMAND As Integer = &H00000000
    6. Private Const SC_CLOSE As Integer = &HF060
    7. <DllImport("user32.dll")>
    8. Private Function DeleteMenu(ByVal hMenu As IntPtr, ByVal nPosition As Integer, ByVal wFlags As Integer) As Integer
    9. <DllImport("user32.dll")>
    10. Private Function GetSystemMenu(ByVal hWnd As IntPtr,
    11. <MarshalAs(UnmanagedType.Bool)> ByVal bRevert As Boolean) As IntPtr
    12. Friend Sub DeleteSysMenu(ByVal hWnd As IntPtr)
    13. Dim menu As IntPtr = NativeMethods.GetSystemMenu(hWnd, False)
    14. NativeMethods.DeleteMenu(menu, NativeMethods.SC_CLOSE, NativeMethods.MF_BYCOMMAND)
    15. End Sub
    16. End Module
    17. End Namespace


    Dann habe ich das in meinen Form-Code gelegt - mit dem anderen Namespace etc. ist das wieder so eine Baustelle von mir.

    Ich bin jetzt bei folgendem angekommen:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Imports System.Windows.Forms
    3. Public Class frm_SimpleComboboxEdit
    4. ' ------ http://ma22-wiki-001/eblwiki/index.php?title=SimpleComboboxEdit_(Klasse_von_EBL.TbAndMED) ------
    5. Private _PossibleValues As New Dictionary(Of Long, String)
    6. Private _CboValue As Long = -1
    7. Private _Index_Value As Long = -1
    8. Private _Instruction As String = ""
    9. Private Const MF_BYCOMMAND As Integer = &H0
    10. Private Const SC_CLOSE As Integer = &HF060
    11. <DllImport("user32.dll")>
    12. Private Function DeleteMenu(ByVal hMenu As IntPtr, ByVal nPosition As Integer, ByVal wFlags As Integer) As Integer
    13. End Function
    14. <DllImport("user32.dll")>
    15. Private Function GetSystemMenu(ByVal hWnd As IntPtr, <MarshalAs(UnmanagedType.Bool)> ByVal bRevert As Boolean) As IntPtr
    16. End Function
    17. Private Sub DeleteSysMenu(ByVal hWnd As IntPtr)
    18. Dim menu As IntPtr = GetSystemMenu(hWnd, False)
    19. DeleteMenu(menu, SC_CLOSE, MF_BYCOMMAND)
    20. End Sub
    21. ...


    Der Code-Converter hatte keine End-Funktion eingebaut und deshalb habe ich das manuell in Zeile 15 und Zeile 18 gemacht.

    Drei Fragen jetzt:

    Fü die DllImport-Zeilen wird folgendes angeezeigt:



    und wenn ich dann die Funktion DeleteSysMenu, vermutlich im Load des Forms (liege ich richtig?), aufrufen muss brauche ich ja noch ein hWnd - woher nehmen und nicht stehen?

    Kann man mir nochmal weiterhelfen?

    Gruß Jan

    jan99 schrieb:

    woher nehmen und nicht stehen?
    So was:
    docs.microsoft.com/en-us/dotne…ntrol.handle?view=net-5.0
    ====
    Der hier konvertiert die Deklarationen richtig:
    codeconverter.icsharpcode.net/
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Moin!

    mit Deinem Code habe ich nochmal weitergesucht und einen anderen Beitrag hier gefunden => MaximizeBox ganz ausblenden

    Den habe ich übernommen und etwas modifiziert und dabei ist folgendes rausgekommen:

    VB.NET-Quellcode

    1. 'Imports System.Runtime.InteropServices
    2. Imports System.Windows.Forms
    3. Public Class frm_SimpleComboboxEdit
    4. ' ------ http://ma22-wiki-001/eblwiki/index.php?title=SimpleComboboxEdit_(Klasse_von_EBL.TbAndMED) ------
    5. Private _PossibleValues As New Dictionary(Of Long, String)
    6. Private _CboValue As Long = -1
    7. Private _Index_Value As Long = -1
    8. Private _Instruction As String = ""
    9. Private _HideCancel As Boolean = False
    10. Private Const MF_BYCOMMAND As Integer = &H0
    11. Private Const SC_CLOSE As Integer = &HF060
    12. Private Declare Function GetSystemMenu Lib "user32" (
    13. ByVal hwnd As Long,
    14. ByVal bRevert As Integer) As Integer
    15. Private Declare Function DeleteMenu Lib "user32" (
    16. ByVal hMenu As Long,
    17. ByVal nPosition As Long,
    18. ByVal wFlags As Long) As Long
    19. Private Declare Function DrawMenuBar Lib "user32" (
    20. ByVal hwnd As Long) As Long
    21. Private Sub DeleteSysMenu(ByVal hWnd As IntPtr)
    22. Dim menu As IntPtr = GetSystemMenu(hWnd, False)
    23. DeleteMenu(menu, SC_CLOSE, MF_BYCOMMAND)
    24. End Sub
    25. Private Sub DLG_SimpleComboboxEdit_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    26. ' optional den Abbruch-Button ausblenden
    27. If _HideCancel = True Then
    28. bt_cancel.Visible = False
    29. ' hier noch das Dialog-X ausblenden.
    30. DeleteSysMenu(Me.Handle)
    31. Else
    32. bt_cancel.Visible = True
    33. End If
    34. End Sub


    und ein Dialog mit ausgegrautem X!

    Ziel erreicht.

    Danke nochmal.

    Gruß Jan
    Man nehme ein Form mit ControlBox = False und nehme

    VB.NET-Quellcode

    1. Private AllowClosing As Boolean = False
    2. Private Sub FrmNonClosable_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    3. e.Cancel = Not AllowClosing
    4. End Sub
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. AllowClosing = True
    7. Close()
    8. End Sub

    Kein [X], kein Alt+F4
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Also ich mach das wie @VaporiZed beschrieben hat im Closing Event ... keine Ahnung warum man da so kompliziert mit haufenweise Code und irgendwelchen User32.dll‘s rum hantiert.

    Edit: @VaporiZed hat nichts mit vape zu tun :)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

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

    @mrMo: Waaas?!? @VapeNation hat doch hier gar nichts gesagt! :P :D ;)
    Ja, nach der Eingabe von @Vap komm nicht ich. Zumindest nicht vor der nächsten Karteileichenlöschung.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @jan99 Mit VB6-Deklarationen?
    Die .NET-Deklarationen findest Du hier: pinvoke.net/
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!