Jump to content

Evitar fecho de janela


zephirus
 Share

Recommended Posts

Olá,

Tenho uma form que não quero que seja fechada a não ser através de um botão. Como posso garantir isto? Esta questão aparece porque eu tinha uma form que era basicamente o lock de uma aplicação, tal como o lock do windows, e só depois reparei que se fizesse Alt+F4, a form fechava.

Entretanto já adicionei este código à form para não permitir o Alt+F4:

Private Sub LoginKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
   If e.Alt = True And e.KeyCode = Keys.F4 Then
      e.Handled = True
   End If		
End Sub

A minha questão é: isto é suficiente? Eu não quero permitir nenhuma outra maneira de o user fechar a janela sem ser no botão.

Link to comment
Share on other sites

Ja me deparei com esse problema, encontrei um método muito simples que desactiva o X (que é necessário) e automaticamente o atalho do teclado também..

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

Basicamente, é uma propriedade que é declarada como 'Overloads Overrides', que ocorre internamente ao criar a instância da classe..

Deves colocar este código na Form em questão.

Compr.

Making the impossible possible and pwing the world on db at a time.

Link to comment
Share on other sites

Ja me deparei com esse problema, encontrei um método muito simples que desactiva o X (que é necessário) e automaticamente o atalho do teclado também..

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

Basicamente, é uma propriedade que é declarada como 'Overloads Overrides', que ocorre internamente ao criar a instância da classe..

Deves colocar este código na Form em questão.

Compr.

Olá fLaSh_PT,

O (x) no canto da janela já não me preocupa porque eu tenho o borderstyle da form em questão em 'FixedToolWindow' e a propriedade "Control Box" em False. Tendo eu estas propriedades, é necessário todo o código que exemplificas? Esse código desabilita o Alt+F4 só? Desculpa insistir, mas não há mais nenhuma maneira de fechar a janela, estou correcto?

Link to comment
Share on other sites

Já tentaste utilizar um boolean para controlar se cancelas a intenção de fecho ou não, quando o evento Form_Closing é disparado?

Algo do género:

-Ao fechar, o boolean nao sofreu alteração, então cancela o fecho.

-Ao fechar por o botão, afectas o boolean, Me.Close e não cancelas o fecho.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

Olá fLaSh_PT,

O (x) no canto da janela já não me preocupa porque eu tenho o borderstyle da form em questão em 'FixedToolWindow' e a propriedade "Control Box" em False. Tendo eu estas propriedades, é necessário todo o código que exemplificas? Esse código desabilita o Alt+F4 só? Desculpa insistir, mas não há mais nenhuma maneira de fechar a janela, estou correcto?

O código que coloquei também desabilita o Alt + F4 😄

Making the impossible possible and pwing the world on db at a time.

Link to comment
Share on other sites

Já tentaste utilizar um boolean para controlar se cancelas a intenção de fecho ou não, quando o evento Form_Closing é disparado?

Algo do género:

-Ao fechar, o boolean nao sofreu alteração, então cancela o fecho.

-Ao fechar por o botão, afectas o boolean, Me.Close e não cancelas o fecho.

Pois, se calhar é melhor ir por essa via. Com isso não preciso de especificar se o fecho é feito pela controlbox ou por atalhos. Apenas não permito que seja fechado a não ser pelo botão.

Link to comment
Share on other sites

Já tinha feito isto noutro programa mas não era essencial na altura que o Alt+F4 ficasse desabilitado. Neste código, além de não ser permitido o fecho da janela com a variável 'sair' em True, obriga a que o programa feche se o user desligar o windows. Descobri isto quando verifiquei que a aplicação quando está no system tray, não deixava o windows fechar.

Código em baixo:

Private Sub BlockWindowFormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.Closing
   If e.CloseReason = CloseReason.WindowsShutDown Then
      sair = True
   End If
   Select Case sair
      Case = True
         sair = False
      Case Else
         e.Cancel = True
   End Select
End Sub

Obrigado mais uma vez pela ajuda. Este fórum é excelente  😄

Link to comment
Share on other sites

Só um aparte:

Ali onde tens o teu select case, podes abreviar por exemplo para:

IIf(sair, sair = False, e.cancel = True)
'ou
If sair = True Then sair = False Else e.cancel = True

É o mesmo. Só por dizer que fica numa linha.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

Ainda no seguimento da mesma questão ou pelo menos no mesmo tipo de problema, existe maneira de não ser permitido o duploclick na janela para fazer maximize? A janela já não tem ControlBox mas ao fazer o duplo click ele tenta maximizar (apesar de não dar porque eu tenho isto em borderstyle = FixedToolWindow). O que acontece é que a janela "muda de sítio" no ecrã sem mudar de tamanho.

Link to comment
Share on other sites

Ainda no seguimento da mesma questão ou pelo menos no mesmo tipo de problema, existe maneira de não ser permitido o duploclick na janela para fazer maximize? A janela já não tem ControlBox mas ao fazer o duplo click ele tenta maximizar (apesar de não dar porque eu tenho isto em borderstyle = FixedToolWindow). O que acontece é que a janela "muda de sítio" no ecrã sem mudar de tamanho.

Entretanto encontrei a solução. Para quem precisar:

	Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
	Const WM_NCLBUTTONDBLCLK As Int32 = &HA3
	If m.Msg = WM_NCLBUTTONDBLCLK Then
		Exit Sub
	End If
	MyBase.WndProc(m)
End Sub
Link to comment
Share on other sites

Entretanto encontrei a solução. Para quem precisar:

	Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
	Const WM_NCLBUTTONDBLCLK As Int32 = &HA3
	If m.Msg = WM_NCLBUTTONDBLCLK Then
		Exit Sub
	End If
	MyBase.WndProc(m)
End Sub

Não percebi patabina deste código, alguém me consegue explicar? Não quero ficar na ignorância 😄

Obrigado.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.