winapi - Amener la fenêtre au premier plan en C # à l'aide de l'API Win32

Translate

J'écris une application qui doit mettre la fenêtre d'une application externe au premier plan, et pas nécessairement voler le focus (il existe un paramètre que l'utilisateur peut basculer pour voler / ne pas voler le focus).

Quelle est la meilleure façon de procéder en utilisant l'API win32? J'ai essayé SetForeground () mais il vole toujours l'attention et ne fonctionne pas systématiquement.

Quelle est la meilleure manière de s'occuper de ça? Des pensées?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Mag Lee
Translate

SetForegroundWindow est censé voler le focus et il y a certains cas où cela échouera.

La fonction SetForegroundWindow place le thread qui a créé la fenêtre spécifiée au premier plan et active la fenêtre. La saisie au clavier est dirigée vers la fenêtre

Essayez de capturer la mise au point avecSetCaptureavant de passer l'appel. Examinez également différentes manières d'amener la fenêtre au premier plan: SetForeGroundWindow, SetActiveWindow, même la simulation d'un clic de souris peut le faire.

La source
Translate

Quelle est la différence entre SetForeGroundWindow, SetActiveWindow et BringWindowToTop? Il semble qu'ils font tous la même chose.

Selon MSDN, SetForeGroundWindow activera la fenêtre et y dirigera le focus clavier. Cela tente de fonctionner même lorsque votre processus est en arrière-plan. SetActiveWindow fait la même chose que SetForeGroundWindow, mais il ne fait rien si votre application n'est pas l'application au premier plan. Enfin, BringWindowToTop amène uniquement la fenêtre vers le haut et ne modifie pas le focus du clavier.

La source
Translate

Vous pouvez essayer la fonction BringWindowToTop pour ne pas voler le focus. Je ne l'ai pas utilisé, mais cela semble être ce que vous recherchez.

La source
Translate

Avez-vous essayé d'utiliser SetWindowPos. Il s'agit de la fonction canonique pour déplacer, redimensionner et définir l'ordre z dans Windows. Vous pouvez utiliser un indicateur SWP_NOACTIVATE. Regarderhttp://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx. Je n'ai pas essayé cela sur une fenêtre appartenant à un autre processus, mais cela vaut probablement la peine d'essayer.

La source
Translate

SetWindowPos + SWP_NOACTIVATE fait le travail.

La source
Translate

Vous pouvez utiliser FindWindow pour obtenir le HWND de la fenêtre, puis utiliser la fonction BringWindowToTop trouvée dans l'API Win32.

La source