WinForms: Comment déterminer si la fenêtre n'est plus actif (pas de fenêtre enfant a le focus)?

StackOverflow https://stackoverflow.com/questions/2517295

  •  22-09-2019
  •  | 
  •  

Question

Mon application utilise plusieurs fenêtres

Je veux cacher une fenêtre spécifique dans le cas où l'application perd le focus (lorsque la fenêtre active n'est pas la fenêtre d'application) Source

Je traitais l'événement Deactivate de ma forme principale.

    private void MainForm_Deactivate(object sender, EventArgs e) 
    {
      Console.WriteLine("deactivate");
      if (GetActiveWindow() == this.Handle) 
      {
        Console.WriteLine("isactive=true");
      }
      else
      {
        Console.WriteLine("isactive=false");
      }
    }

[DllImport("user32.dll")]
static extern IntPtr GetActiveWindow();

La sortie est toujours

deactivate
isactive=true

Je l'ai observé le même comportement si une nouvelle fenêtre à l'intérieur de ma demande reçoit le focus et aussi si je clique dans une autre application.

Je me attends GetActiveWindow pour revenir la poignée de la nouvelle fenêtre active lorsqu'elle est appelée à partir du gestionnaire de Deactivate. Au contraire, elle renvoie toujours la poignée de ma fenêtre d'application.

Comment est-ce possible? L'événement Deactivate traité « trop tôt »? (Alors que la principale forme est toujours actif?).

Comment puis-je détecter que ma demande a perdu le focus (ma fenêtre d'application n'est pas la fenêtre active) et une autre application acquise sans courir GetActiveWindow sur une minuterie?

Était-ce utile?

La solution

D'après ce que je peux voir GetActiveWindow get est la fenêtre active pour le thread appelant, à savoir votre application il va toujours retourner la fenêtre actuelle de votre application. Je pense que peut-être vous cherchez GetForegroundWindow qui retournera la poignée à la fenêtre, l'utilisateur dispose actuellement actif.

Autres conseils

j'observe le même comportement (.NET 3.5, Visual Studio 2008). La documentation est floue:

  

lorsque la forme Survient perd le focus et n'est plus la forme active.

Cependant, le contraste entre les noms d'événement (Activer d par rapport Deactivate) suggère que l'événement ne se fait avant la désactivation réelle.

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