12
votes

Comment vérifier si la fenêtre est vraiment visible sous les formulaires Windows?

Normalement, vous utilisez Form.Visible pour vérifier si la fenêtre est visible du tout. Mais parfois sur la fenêtre de l'écran est sous d'autres fenêtres, il est donc vraiment invisible.

Alors, comment vérifier les formulaires Windows C # Si la fenêtre est vraiment visible ou non?

Je voudrais accomplir ceci: quand je clique sur Ctrl + K sur mon clavier et ma fenêtre est visible sur mon écran, il ne fait rien. Mais quand c'est sous d'autres fenêtres, il apparaît au sommet (apporter à l'avant).

genre considère


0 commentaires

10 Réponses :


1
votes

hm ... question étrange. : P

Peut-être que vous pourriez peut-être demander à l'emplacement des formulaires et si deux formes interlap (découvrez leurs coordonnées et faire une méthode simple) Vérifiez si un formulaire a la mise au point (). Si cela a l'accent, alors d'autres doivent être "invisibles" ( dans le sens où un utilisateur ne peut pas le voir car il est sous l'autre formulaire ).

Évidemment, cette méthode est Hacky au mieux , mais c'est quelque chose que vous pouvez commencer à travailler.


0 commentaires

4
votes

Vous pouvez appeler le Activez la méthode sur le formulaire pour l'amener à l'avant si ce n'est pas déjà.

Toutefois, notez que si un programme différent est actif, il clignotera généralement simplement le bouton Desktop (en fonction de l'endroit où vous l'appelez). C'est Windows ' Protection standard contre la mise au point - Voler et vous ne devrait pas essayer de contourner-y .


0 commentaires

3
votes

Pour répondre à la question, vous pouvez essayer d'appeler le windowfrompoind fonction API pour trouver la fenêtre à différents moments de votre formulaire et vérifier s'il renvoie la poignée de tout ce que vous attendez d'être à ce stade.


1 commentaires

C'est la meilleure réponse pour moi après avoir récuronné le web et donc. Slaks à la rescousse! Que Donc, parle de lui-même.



4
votes

Vous pouvez utiliser Windows API pour énumérer toutes les fenêtres, récupérer leur commande Z et le comparer à l'ordre Z de votre fenêtre. Je pense que quelqu'un a déjà fait cela déjà ici .


0 commentaires

0
votes

Vous devriez être capable de savoir si votre fenêtre est visible en remplaçant la méthode Onpaint. Vous voudrez passer le contrôle de la classe de base afin de faire la peinture réelle, mais vous pourrez détecter si un message de peinture est reçu. Mise à jour: Non, cela ne fonctionne pas, désolé!

En principe, la méthode d'activation devrait apporter votre fenêtre au premier plan, mais dans la pratique, j'ai toujours trouvé cette problématique si d'autres processus ont la mise au point de saisie. Si vous voulez vraiment que quelqu'un puisse voir une fenêtre, réglez le plus haut bit, mais attendez-vous à ce qu'ils soient ennuyés! Un moyen sûr d'avoir une attention particulière à une attention particulière pour une fenêtre consiste à le fermer et à le rouvrir si vous pouvez vous échapper avec cela.

Un moyen d'obtenir ce que vous recherchez est d'utiliser une icône de notify, cela permettra d'attirer l'attention de l'utilisateur de manière à être conforme aux directives de Windows UI.


0 commentaires

7
votes

i googled poisson sur le Web, mais il ne trouve aucune réponse directe pour voir si une partie d'une fenêtre est vraiment visible pour l'utilisateur. En fait, j'ai eu besoin d'un moyen de "hittertest" la forme, si la souris est actuellement en haut de la partie visible de la fenêtre. Je pensais partager le code qui a pris plusieurs jours pour accomplir: xxx


0 commentaires

1
votes

Vous pourriez aussi .. :) Obtenez la propriété ClickAnpoint de l'automatisement correspondant à la fenêtre. Je ne suis certainement pas sûr que cela soit complètement précis cependant. Cela a travaillé dans 99% des cas pour moi et je vérifie toujours sur les 1% d'autres, où le problème réside (pourrait être de mon côté ou un mauvais utilisateur manipulation, ou.)


0 commentaires

-4
votes

Définissez simplement la propriété formul.alwaysontop sur true .


1 commentaires

Ne vous aidera pas si une autre fenêtre a aussi la même propriété



2
votes

J'ai effectivement essayé de mettre en œuvre Slack Suggestion. Bien que je l'ai écrit dans vb.net, pas c # xxx


0 commentaires

0
votes

Voici une version C # modifiée du code dans @ Marvindickhaus 'Réponse .

Il permet de tester si une fenêtre ou un contrôle est visible ou partiellement visible en vérifiant certains points. P>

Le principal intérêt de base est Pour pouvoir apporter une forme à l'avant ou partiellement couverte. p>

Il utilise 13 points mais plus peut être ajouté, et la méthode peut être améliorée pour passer un nombre arbitraire et calculer les coordonnées de ce numéro. La marge par défaut est définie sur 15 pour Windows 10 formulaires. P>

static public bool IsVisibleOnTop(this Control control, int requiredPercent = 100, int margin = 15)
{
  if ( !control.Visible ) return false;
  var controls = control.GetAllControls<Control>().Select(c => c.Handle).ToList();
  var points = control.GetGridPoints(margin);
  bool all = requiredPercent == 100;
  int found = 0;
  int required = points.Count();
  if (!all) required = required * requiredPercent / 100;
  foreach ( var point in points )
  {
    var handle = NativeMethods.WindowFromPoint(new NativeMethods.PointStruct(point.X, point.Y));
    if ( handle == control.Handle || controls.Contains(handle) )
    {
      if ( ++found == required ) return true;
    }
    else
    {
      if ( all ) return false;
    }
  }
  return false;
}


0 commentaires