2017-08-04 1 views
4

ich um die interwebs und verschiedene Teile dieser Ressource gesucht haben, wo diese Frage gestellt wurde und bemerkte ich die folgenden Bit-Code bekam:Wie Sie ALT + F4 eines WinForm verhindern, aber alle anderen Formen des Schließens eines WinForm zulassen?

Protected Overrides ReadOnly Property CreateParams() As CreateParams 
    Get 
     Dim cp As CreateParams = MyBase.CreateParams 
     Const CS_NOCLOSE As Integer = &H200 
     cp.ClassStyle = cp.ClassStyle Or CS_NOCLOSE 
     Return cp 
    End Get 
End Property 

Welche wie vorgesehen funktioniert, tut dies deaktivieren ALT + F4 entfernt, benutzt. Doch als unbeabsichtigte Nebenwirkung dieses Code: das Fenster über das Control Box zu schließen ist deaktiviert:

Closing "X" is disabled

Gibt es eine Version dieses Codes dass disables ALT+F4 aber immer noch für das Schließen des Fensters erlaubt über seine Kontrollbox oder andere UI-Optionen (wie zum Beispiel einer Schaltfläche zum Schließen und Schließen Option in einem Menü.)

ich kenne jemand sagt die e.CloseReason of the form jedoch UserClosing ist der einzige Grund, der ähnelt zu prüfen, was würde ich mag an tun Sie jedoch ..., dass die Benutzerschnittstelle immer noch deaktiviert ist. Es sei denn, es gibt einen Code, den ich vergessen habe.

+2

Vielleicht diese Frage wird Ihnen helfen: https://stackoverflow.com/questions/5805335/how-to-handle-a-form-close-event-in-vb-net – muffi

Antwort

1

Antwort auf Ihren Kommentar, KeyDown aus einer separaten Klasse Handhabung.

Dokumentation:

Public NotInheritable Class MainInterface 
    Private Sub New() 'No constructor. 
    End Sub 

    Public Shared Sub DisableAltF4(ByVal TargetForm As Form) 
     TargetForm.KeyPreview = True 
     AddHandler TargetForm.KeyDown, AddressOf Form_KeyDown 
    End Sub 

    Private Shared Sub Form_KeyDown(sender As Object, e As KeyEventArgs) 
     e.Handled = (e.Alt AndAlso e.KeyCode = Keys.F4) 
    End Sub 
End Class 

nun in jeder Form des Load Event-Handler können Sie tun:

Private Sub yourForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    MainInterface.DisableAltF4(Me) 
End Sub 

Wie Olaf gesagt, Sie auch alle Formen von einer Basisklasse erben machen kann. Dies könnte jedoch ein wenig komplizierter werden, da Sie sowohl die yourForm.vb als auch die yourForm.Designer.vb Datei, die Sie von der Basisform erben möchten, mitteilen müssen.

Public Class BaseForm 
    Inherits Form 

    Protected Overrides Sub OnLoad(e As System.EventArgs) 
     MyBase.OnLoad(e) 
     Me.KeyPreview = True 
    End Sub 

    Protected Overrides Sub OnKeyDown(e As System.Windows.Forms.KeyEventArgs) 
     MyBase.OnKeyDown(e) 
     e.Handled = e.Handled OrElse (e.Alt AndAlso e.KeyCode = Keys.F4) 
    End Sub 
End Class 

In yourForm.vb:

Public Class yourForm 
    Inherits BaseForm 

    ...code... 
End Class 

In yourForm.Designer.vb:

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ 
Partial Class yourForm 
    Inherits yourNamespace.BaseForm 

    ...code... 
End Class 
+0

Getestet nur den ersten Teil der Antwort (die teilweise vor der horizontalen Regel bearbeitet). Das alles checkt aus. (Ich musste "Key Preview" aktivieren, damit es funktioniert. Nicht sicher, ob das ein Teil der Anweisungen war oder nicht.) –

+1

@PaulWilliams: Es war nicht Teil meiner Anweisungen, da ich davon ausgegangen war, dass du es schon getan hast testet Olafs Antwort. Aber ja, es ist erforderlich. ;) –

+1

@PaulWilliams: Ich habe meine Antwort bearbeitet, um das in den Code aufzunehmen. –

0

Sie sollten den entsprechenden CLOSE-Menüeintrag auch aus dem Systemmenü des Formulars entfernen, indem Sie einen Interop-Anruf RemoveMenu() verwenden. Dies deaktiviert alle Standardoptionen zum Schließen von Fenstern.

Natürlich können Sie Form.Close() in Ihrem Code aufrufen, um Ihr Formular zu schließen. Dies kann durch einen Click Event-Handler einer benutzerdefinierten Schaltfläche, eines Menüelements usw. ausgelöst werden. Zusätzlich können Sie eine System.Windows.Forms.IMessageFilter implementieren, um eine benutzerdefinierte Tastenfolge (anstelle von ALT + F4) zu handhaben, um Ihr Formular zu schließen, z. C + L + O + S + E.

+0

Warte warten ... Ich glaube nicht, dass Sie es richtig gelesen haben ... Ich möchte die Menüoption beibehalten, behalten Sie die Option Steuerfeld, aber deaktivieren Sie die ALT + F4-Methode. –

+0

Sie haben Recht, meine Schuld. – KBO

2

Set KeyPreview = True und handhaben das KeyDown-Ereignis:

Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown 
    If e.Alt AndAlso e.KeyCode = Keys.F4 Then 
     e.Handled = True 
    End If 
End Sub 
+0

Weird Frage, gibt es eine Möglichkeit, dies global während eines Programms zu tun, oder muss ich das auf jedem einzelnen Formular verwenden? –

+1

@PaulWilliams: Sie könnten eine gemeinsam genutzte Methode in einer separaten Klasse erstellen, die Sie auf 'Form.Load' jedes Formulars aufrufen (indem Sie das Formular als Parameter übergeben). Dann wird diese Methode die richtigen Eigenschaften festlegen und den Event-Handler für Sie abonnieren. –

+0

Würdest du zufällig den Code dafür haben, weil ich es in einer allgemeinen Klasse versuche, mir Fehler zu geben. –

0

Ganz einfach:

In C#

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    if (keyData == (Keys.Alt | Keys.F4)) 
    { 
     return true; // The key is manually processed 
    } 
    else 
     return base.ProcessCmdKey(ref msg, keyData); 
} 

In VB.Net

Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean 
    If keyData = (Keys.Alt Or Keys.F4) Then 
     Return True 
    Else 
     Return MyBase.ProcessCmdKey(msg, keyData) 
    End If 
End Function