zephirus Posted October 2, 2009 at 11:23 AM Report Share #289606 Posted October 2, 2009 at 11:23 AM 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 More sharing options...
fLaSh_PT Posted October 2, 2009 at 11:34 AM Report Share #289608 Posted October 2, 2009 at 11:34 AM 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 More sharing options...
zephirus Posted October 2, 2009 at 11:50 AM Author Report Share #289611 Posted October 2, 2009 at 11:50 AM 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 More sharing options...
ribeiro55 Posted October 2, 2009 at 11:54 AM Report Share #289613 Posted October 2, 2009 at 11:54 AM 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 More sharing options...
fLaSh_PT Posted October 2, 2009 at 12:05 PM Report Share #289618 Posted October 2, 2009 at 12:05 PM 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 More sharing options...
zephirus Posted October 2, 2009 at 01:08 PM Author Report Share #289630 Posted October 2, 2009 at 01:08 PM 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 More sharing options...
ribeiro55 Posted October 2, 2009 at 01:11 PM Report Share #289631 Posted October 2, 2009 at 01:11 PM E não é isso que pretendes? 😄 Experimenta e depois diz qualquer coisa. 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 More sharing options...
zephirus Posted October 2, 2009 at 01:33 PM Author Report Share #289637 Posted October 2, 2009 at 01:33 PM 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 More sharing options...
ribeiro55 Posted October 2, 2009 at 01:44 PM Report Share #289638 Posted October 2, 2009 at 01:44 PM 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 More sharing options...
zephirus Posted October 2, 2009 at 01:48 PM Author Report Share #289640 Posted October 2, 2009 at 01:48 PM 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. Link to comment Share on other sites More sharing options...
ribeiro55 Posted October 2, 2009 at 03:45 PM Report Share #289655 Posted October 2, 2009 at 03:45 PM Reparei agora. Esquece lá a dica do IIF. Esse método devolve objectos. Não se trata de um orientador de fluxo 😄 Para esse caso não iria funcionar. 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 More sharing options...
zephirus Posted October 2, 2009 at 03:48 PM Author Report Share #289656 Posted October 2, 2009 at 03:48 PM Reparei agora. Esquece lá a dica do IIF. Esse método devolve objectos. Não se trata de um orientador de fluxo 😄 Para esse caso não iria funcionar. Alright 🙂 Link to comment Share on other sites More sharing options...
zephirus Posted October 2, 2009 at 04:11 PM Author Report Share #289661 Posted October 2, 2009 at 04:11 PM 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 More sharing options...
zephirus Posted October 2, 2009 at 07:37 PM Author Report Share #289692 Posted October 2, 2009 at 07:37 PM 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 More sharing options...
bioshock Posted October 3, 2009 at 06:22 PM Report Share #289821 Posted October 3, 2009 at 06:22 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now