Windows 7: comment amener une fenêtre à l'avant quelle que soit l'autre fenêtre?
Je me suis mise en œuvre d'une barre de tâches de remplacement, dock-comme l'application sélecteur de style de programme. Il fait un unique truc avec OpenGL, et avec des raccourcis clavier, donc la façon dont il est mis en place, la fenêtre n'est pas toujours nécessaire de se concentrer. J'aimerais mettre en œuvre pour que je peut apporter un arbitraire de la fenêtre au premier plan, un peu comme une barre des tâches ou un ALT-TAB programme serait.
Cependant, mon code provoque l'icône de l'application flash dans la barre des tâches. La documentation de l'API Windows dit que c'est ce qui est censé se produire, mais je suis à la recherche d'un moyen de contourner cela.
J'ai adapté mon code à partir des exemples suivants, qui disent que le fait d'attacher à l'avant-plan thread doit vous permettre de définir la fenêtre de premier plan. Voici les sites:
http://www.voidnish.com/Articles/ShowArticle.aspx?code=dlgboxtricks
http://invers2008.blogspot.com/2008/10/mfc-how-to-steal-focus-on-2kxp.html
Mon code ressemble à ceci. Notez que c'est à l'aide de la win32 wrappers python (soi-même.hwnd est le handle de la fenêtre, je veux porter à l'avant):
fgwin = win32gui.GetForegroundWindow()
fg = win32process.GetWindowThreadProcessId(fgwin)[0]
current = win32api.GetCurrentThreadId()
if current != fg:
win32process.AttachThreadInput(fg, current, True)
win32gui.SetForegroundWindow(self.hwnd)
win32process.AttachThreadInput(fg, win32api.GetCurrentThreadId(), False)
Cependant, à moins que ma fenêtre est la fenêtre de premier plan (ce qui n'est généralement pas), cela provoque l'icône du programme pour flash.
Je fais le filetage de fixation de mal? Est-il une autre façon de contourner ce problème? J'y figure doit être, comme il y a beaucoup de demande de transfuges qui semblent être en mesure de le faire très bien.
Où j'écris ces lignes en python, mais si il y a une solution dans une autre langue, je vais utiliser des emballages ou faire tout ce qui est necessarry pour obtenir cette place et en cours d'exécution.
Merci d'avance!
EDIT: je serais ouvert à un moyen de le faire fonctionner sur mon ordinateur, c'est à dire un moyen de permettre, sur ma machine, une façon pour toutes les applications à prendre le focus.
RÉSOLU: Ce que vous avez à faire est de désactiver le verrou de premier plan. Il s'avère que c'était aussi simple que cela:
win32gui.SystemParametersInfo(win32con.SPI_SETFOREGROUNDLOCKTIMEOUT, 0, win32con.SPIF_SENDWININICHANGE | win32con.SPIF_UPDATEINIFILE)
source d'informationauteur jmite
Vous devez vous connecter pour publier un commentaire.
J'ai eu un peu de code qui est en cours depuis des années, va tout le chemin du retour à Windows 95. En double-cliquant sur les applications icône de plateau de système, j'ai toujours utilisé des fonctions de l'API Win32 tels que BringWindowToTop et SetForegroundWindow apporter mon application windows au premier plan. Tout cela a cessé de travailler comme prévu sur Windows 7, d'où ma fenêtre de saisie serait de se retrouver derrière les autres fenêtres et l'icône de la fenêtre clignote dans la barre d'état. Le travail autour de " qui je suis venu avec était présent; et il semble fonctionner sur toutes les versions de Windows.
Je n'aime pas ces suggestions de l'aide
win32gui
parce que vous ne pouvez pas installer facilement que viapip
. Alors, voici ma solution:Tout d'abord, installez
pywinauto
viapip
. Si vous êtes sur Python 2.7.9 ou une version plus récente sur le 2 de la branche, ou Python 3.4.0 ou une version plus récente de l'3 branche,pip
est déjà installé. Pour tous les autres, mise à jour de Python pour l'obtenir (ou vous pouvez télécharger et installer manuellement en exécutant ce scriptsi vous devez exécuter une ancienne version de Python.)Il suffit d'exécuter cette ligne de commande (non pas de l'intérieur Python):
Ensuite, importez ce que vous avez besoin de
pywinauto
:Enfin, c'est juste une ligne réelle:
Selon nspire, j'ai essayé la solution avec python 2.7 et W8, et il fonctionne comme un charme, même si la fenêtre est réduite *.
win32gui.ShowWindow(HWND, win32con.SW_RESTORE)
il travaille maintenant dans toutes les situations .Si vous êtes à la mise en œuvre de touches de raccourci, l'utilisation
RegisterHotKey
. Comme Raymond Chen met (compagnon article de blog à la une qui est déjà lié par Chris), "Appuyant sur un régime enregistré d'raccourci clavier vous donne l'avant-plan de l'activation de l'amour".La documentation de la
SetForegroundWindow
fonction explique, que c'est effectivement le comportement; les processus ne devrait pas être capable de "voler" la mise au point. Cependant, il est possible de régler votre code pour qu'il fonctionne de toute façon.Ont un look à la remarque de la section de
LockSetForegroundWindow
: il expliqueVous pouvez exploiter ce comportement en faisant de votre programme de simuler en appuyant sur la touche Alt enfoncée à l'aide de la
SendInput
fonction avant d'appelerSetForegroundWindow
.