none
Botão que não ativa seu formulário RRS feed

  • Pergunta

  • Preciso criar um botão (herado de Button por exemplo) que ao ser clicado dispare o evento de Click porém não ative o seu formulário caso este esteja desativado.

    Pesquisando na rede encontrei uma maneira de fazer isso em relação a outros programas mas não funciona em relação aos formulários do mesmo programa.

    Exemplo: Se eu colocar o código abaixo numa aplicação e abrir também o Notepad sendo que o Notepad estiver com a tela ativa, ao clicar no botão da minha aplicação o evento de click do botão é executado e o Notepad continua sendo o programa/formulário ativo. Porém se eu tiver dois forms abertos na mesma aplicação (uma aplicação MDI) ao clicar no botão o formulário "parent" desse botão é ativado.

    Eis o código implementado no Form que contém o botão:

            protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams baseParams = base.CreateParams;
                    baseParams.ExStyle |= (WinMessages.WS_EX_NOACTIVATE);
                    return baseParams;
                }
            }

    Ufa... será que fui claro?... alguém tem alguma dica?


    Tytto

    • Movido Olavo Oliveira Neto quinta-feira, 5 de abril de 2012 14:07 Amigo, estou movendo sua thread para um fórum especifico de Windows Forms (De:.NET Development - Geral)
    quarta-feira, 4 de abril de 2012 19:14

Todas as Respostas

  • Faz o seguinte, vamos ver se eu entendi, tenho uma solução:

    Você tem dois forms, o Fom1 que está ativo e o Form2 que está aberto e tem um botão mas não está ativo, coloque o evento de clique do botão do Form2 como público acesse-o pelo Form1, o Form1 continuará ativo! Olhe esse exemplo:

    Form1

        public partial class Form1 : Form
        {
            Form2 _Form2 = new Form2();
    
            public Form1()
            {
                InitializeComponent();
                _Form2.Show();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                _Form2.button1_Click(null, null);
            }
        }


    Form2

        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
    
            public void button1_Click(object sender, EventArgs e)
            {
                //aqui vai seu pr´rocedimento, aqui eu estou mudando o txto do botão
                button1.Text = "Teste";
            }
        }

    Abraços! Espero ter te ajudado!


    thiagokoelho

    quinta-feira, 5 de abril de 2012 18:54
  • Na verdade não é bem isso.

    Imagine que eu tenho uma aplicação chamada AppX e ela esta rodando e no Deactivate do formulário principal tem uma linha de código que diz que quando o formulário for desativado deverá fechar a aplicação.

    No entando, antes de abrir a aplicação AppX, eu abri a aplicação Ap0. Neste neste caso, na Ap0 existe um botao que chama a AppX.

    Se eu clicar no botao da Ap0, a AppX será chamada e o formulario principal da AppX ficará ativo.

    Ai está o problema... pois quando eu clicar num outro botao da Ap0 o formulário principal da AppX será desativado e neste caso fechará a AppX.

    Resumindo: O que preciso e que ao clicar no botao ele não ative o seu formulario Parent.

    Será que deu para entender?

    To travado nesse problema para resolver uma integração grande em aplicativos específicos.


    Tytto

    segunda-feira, 9 de abril de 2012 22:23
  • Tytto, acho que isso não será possível porque sempre que voce clica no botão de alguma tela ela é ativada, o que você pode fazer é quando ela for ativada, desativar novamente ou o mais prático seria usar as apis do windows por exemplo a SendMessage para enviar um comando para o botão dessa outra aplicação dessa forma ele não ativaria. Se foi isso que entendi o que quer dizer.

    Bruno Ferreira de Souza
    MSP - Microsoft Student Partner
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    MCC - Microsoft Community Contributor
    www.maestrodotnet.com.br
    @BrunoMaestro

    domingo, 15 de abril de 2012 06:37
  • Na verdade é exatamente isso.

    Se fixer um override do método WndProc e não executar a herança da classe base quando a Message for WM_NCHITTEST ou WM_NCPAINT a princípio funciona a questão do foco, porém o controle passa a não fazer mais nada (não reconhece eventos de click, de foco...).

    Pela lógica eu acho que somente algum tipo de message deveria ser interceptada ou algum outro SendMessage em substiruição dela.... mas qual message?

    Desde já agradeço a sua ajuda.


    Tytto

    segunda-feira, 16 de abril de 2012 11:39
  • Dá  uma olhada nesses exemplos:

    http://www.vbforums.com/showthread.php?t=667139

    http://www.devasp.net/net/articles/display/690.html


    Bruno Ferreira de Souza
    MSP - Microsoft Student Partner
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    MCC - Microsoft Community Contributor
    www.maestrodotnet.com.br
    @BrunoMaestro

    segunda-feira, 16 de abril de 2012 20:37