• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

zephirus

Evitar fecho de janela

15 mensagens neste tópico

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E não é isso que pretendes? :D

Experimenta e depois diz qualquer coisa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

Obrigado pela dica.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Reparei agora.

Esquece lá a dica do IIF.

Esse método devolve objectos. Não se trata de um orientador de fluxo :D

Para esse caso não iria funcionar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Reparei agora.

Esquece lá a dica do IIF.

Esse método devolve objectos. Não se trata de um orientador de fluxo :D

Para esse caso não iria funcionar.

Alright :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 :D

Obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora