Question

Depuis Compact Framework appelle Show() sur le formulaire transmis à Application.Run() , j'ai décidé de créer ma propre pompe de message.

Je ne sais pas comment je peux le faire.

Toute aide (comme un exemple simple) sera apprécié.

Était-ce utile?

La solution

  • Avez-vous essayé d'attraper l'événement VisibleChanged?

this.Shown += new EventHandler(Form1_Shown);

void Form1_Shown(object sender, EventArgs e)
{
    this.Hide();
}
  • Vous pouvez également essayer d'intercepter le message en remplaçant la WndProc .
    protected override void WndProc(ref Message m)
    {
        const int SW_SHOW = 5;
        if (m.Msg == SW_SHOW)
        {
            //DoSomething();
        }

        base.WndProc(ref m);
    }
  • Une pompe de message typique ressemble à ce qui suit:
MSG msg;
while(GetMessage(&msg, hwnd, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    // DoSomething.
}

Autres conseils

Je trouve cela un problème plus grand que vous prévoir pour une application sous forme de fenêtres. Pour ma solution j'ai tiré des suggestions de trois autre site Web et a trouvé que cette solution fonctionne très bien. Pour mes besoins, j'ai un service Windows qui a un composant contrôleur d'interface utilisateur dans la zone de notification. L'interface utilisateur a besoin pour démarrer minimisé avec juste l'icône de la barre et un menu contextuel de l'icône. L'interface fonctionne comme une boîte de dialogue modale lorsqu'il est activé, ce qui permet à l'utilisateur de commencer un long processus en cours d'exécution sur un thread d'arrière-plan, une fois démarré l'interface utilisateur doit recommencer à prendre des réponses de l'utilisateur.

Dans le constructeur de la classe Windows Form I mis le ControlBox sur et désactivé les minimiser et maximiser les boutons:

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

Le ControlBox doit être permettre de permettre à l'utilisateur de déplacer la boîte de dialogue autour de l'écran, mais pas changer la taille, désactiver la forme bouton de fermeture, X rouge dans le coin supérieur droit de la forme, je:

// 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;
   }
}

Dans le programme principal où la méthode principale statique fonctionne au démarrage de l'application, j'ai changé le Application.Run par défaut:

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();
    }
 }

Voir la page de conception du formulaire Windows, cliquez droit sur le formulaire et sélectionnez Propriétés, cliquez sur le bouton suivant des événements pour montrer tous les événements de la forme. Faites défiler la liste à l'événement montré et double clic, un nouveau gestionnaire d'événements sera ajouté à votre code source. Accédez à la méthode et ajouter this.Hide() au gestionnaire:

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

Enfin ouvrir la page des propriétés du projet Windows Form et sélectionnez l'onglet Application. Sous Objet de démarrage, sélectionnez la classe du programme comme l'objet de démarrage.

Vous devrez ajouter un bouton ou de menu à votre boîte de dialogue pour permettre la fermeture de la forme sans mettre fin à l'application, réglez le bouton ou le contrôle menu pour masquer l'application, laissant courir dans la zone de notification.

Remplacement de la boucle de message dans la classe d'application n'est pas pratique. Il y a beaucoup plus de choses alors la boucle de message boilerplate de Windows. Il est pas le vrai problème de toute façon, la classe d'application oblige le formulaire à devenir visible avec un appel à ShowWindow (). C'est nécessaire parce que les formes sont initialisés paresseusement, sans ShowWindow () appeler ne crée jamais la poignée de fenêtre native.

Cette question est facile à corriger dans la version régulière du framework .NET en remplaçant SetVisibleCore ():

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

Mais je ne pense pas que ce soit disponible dans CF. Pour trouver une solution, vous aurez besoin d'expliquer exactement pourquoi vous voulez empêcher l'interface utilisateur d'être montré. Sans poignée de fenêtre créée, une application est généralement raide mort. Il pourrait être aussi simple que retarder l'appel Application.Run ().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top