Pergunta

Desde Estrutura compacta chamadas Show() no formulário passado para Application.Run(), Decidi criar minha própria bomba de mensagens.

Não tenho ideia de como posso fazer isso.

Qualquer ajuda (como um exemplo simples) será apreciada.

Foi útil?

Outras dicas

Eu achei que esse era um problema maior do que você prevê para um aplicativo de formulário do Windows. Para minha solução, retire sugestões de três sites diferentes e achei essa solução funcionar muito bem. Para minhas necessidades, tenho um serviço Windows que possui um componente do controlador de interface do usuário na bandeja do sistema. A interface do usuário precisa iniciar minimizada apenas com o ícone da bandeja e um menu de contexto para o ícone. A interface do usuário opera como uma caixa de diálogo modal quando ativada, permitindo que o usuário inicie um processo longo em um thread em segundo plano, uma vez iniciado a interface do usuário precisa retomar as respostas do usuário.

No construtor da classe do formulário do Windows, eu definei o ControlBox Até e desativou os botões Minimize e maximizar:

public SystemTrayApp()
{
    InitializeComponent();
    this.Visible = false;
    // Hide Maximize and Minimize buttons on form
    this.StartPosition = FormStartPosition.CenterScreen;
    this.MaximizeBox = false;
    this.MinimizeBox = false;
}

o ControlBox Precisa permitir que o usuário mova a caixa de diálogo na tela, mas não altere o tamanho, para desativar o botão de fechar o formulário.

// Force form close button to be disabled
private const int CP_NOCLOSE_BUTTON = 0x200;
protected override CreateParams CreateParams 
{
   get 
   {
      CreateParams cp = base.CreateParams;
      cp.ClassStyle = cp.ClassStyle | CP_NOCLOSE_BUTTON;
      return cp;
   }
}

No programa principal em que o método principal estático é executado na inicialização do aplicativo, mudei o padrão Application.Run para:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        SystemTrayApp systemTrayApp = new SystemTrayApp();
        systemTrayApp.Text = "File Copy Service Controller";

        // Show the instance of the form modally.
        systemTrayApp.ShowInTaskbar = true;
        systemTrayApp.ShowDialog();
        Application.Run();
    }
 }

Agora mostre a página de design do formulário do Windows, clique com o botão direito do mouse e selecione Propriedades, selecione o botão Eventos para mostrar todos os eventos para o formulário. Role para baixo até o evento mostrado e clique duas vezes, um novo manipulador de eventos será adicionado ao seu código -fonte. Navegue até o método e adicione this.Hide() para o manipulador:

// Runs the first time the application starts
private void SystemTrayApp_Shown(object sender, EventArgs e)
{
   this.Hide();
}

Por fim, abra a página Propriedades para o projeto do formulário do Windows e selecione a guia Aplicativo. Em objeto de inicialização, selecione a classe do programa como objeto de inicialização.

Você precisará adicionar um botão ou controle de menu à sua caixa de diálogo para permitir o fechamento do formulário sem encerrar o aplicativo, definir o botão ou o controle de menu para ocultar o aplicativo, deixando -o funcionando na bandeja do sistema.

Substituir o loop da mensagem na classe de aplicativo não é prático. Há muito mais acontecendo do que o loop da mensagem do Windows Boilerplate. De qualquer forma, não é o problema real, a classe de aplicativo força o formulário a se tornar visível com uma chamada para ShowWindow (). Isso é necessário porque os formulários são inicializados preguiçosamente, sem o ShowWindow () Chamado, nunca cria a alça da janela nativa.

Este problema é fácil de corrigir na versão regular .NET da estrutura, substituindo SetVisibleCore ():

protected override void SetVisibleCore(bool value) {
  if (!this.IsHandleCreated) {
    this.CreateHandle();
    value = false;  // Prevent becoming visible the first time
  }
  base.SetVisibleCore(value);
}

Mas acho que não está disponível no cf. Para encontrar uma solução, você precisará explicar exatamente Por quê Você deseja impedir que a interface do usuário seja mostrada. Sem qualquer alça de janela criada, um aplicativo geralmente está morto como uma donail. Pode ser tão simples quanto atrasar a chamada do aplicativo.run ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top