Comment définir la Fenêtre de premier plan à partir de Powershell événement abonné action
J'ai un FileSystemWatcher instance en cours d'exécution en arrière-plan de mon PoSh session de regarder pour des modifications sur des fichiers texte. Un bel événement d'abonné est relié à cet événement et, quand on tire, on lance le programme en mode console en appelant Start-Processus. Ce programme vole de se concentrer à partir de l'actuel premier plan de la fenêtre (mon Snob de la console). L'appel de SetForegroundWindow de la PoSh événement abonné à retourner l'objet à mon Snob de la console ne fonctionne pas. SwitchToThisWindow fonctionne la plupart du temps, mais selon la MSDN docs, il shoulnd'pas être utilisé.
Puis-je empêcher Start-Processus de voler l'accent est mis dans cette situation ou de l'événement abonné à la fenêtre qui l'ont eu avant cet événement est déclenché?
SetForegroundWindow
de nouveau?OriginalL'auteur guillermooo | 2010-03-31
Vous devez vous connecter pour publier un commentaire.
Pour moi
SetForegroundWindow
fonctionne bien. Vérifier ce code:Mais notez que si vous hébergez PowerShell ou d'utiliser, par exemple, de la Console (http://sourceforge.net/projects/console/) puis MainWindowHandle est la poignée de votre programme hôte.
Ainsi, au lieu de
(Get-Process -id $pid).MainWindowHandle
vous devez[tricks]::SetForegroundWindow((Get-Process console).MainWindowHandle)
.Exemple avec l'événement timer:
Sinon, si vous exécutez le processus qui a sa fenêtre cachée, cela pourrait résoudre votre problème.
Exemple pris et modifié à partir de la documentation sur msdn sur Processus classe
La je suppose qu'il n'est pas possible sans attendre. Considérez que vous exécutez le processus, mais la fenêtre s'affiche après un certain temps, et il va attraper la mise au point. Vous devez déterminer quand pour obtenir le focus. Ce processus pensez-vous exécuter?
OriginalL'auteur stej
Il semble que ça ne fonctionne pas parce que vous mettez le focus, avant de perdre le focus.
Avez-vous essayé la mise au point par le biais d'un emploi? Il s'exécute en arrière-plan pendant que vous utilisez la console.
Quelque chose de ce genre de travail, il permet de vous concentrer pendant 10 secondes après l'événement
Si vous mélangez dans GetForegroundWindow, vous pouvez attendre jusqu'à ce que vous perdre de vue l'objectif, puis de saisir le dos
http://www.leeholmes.com/blog/MorePInvokeInPowerShell.aspx
CreateProcess
,STARTUP_INFO
,dwFlags
etwShowWindow
comme ils sont censés le faire. Cela implique l'incorporation d'une classe C# dans le script powershell pour faire l'appel d'API, depuis .NETProcess
classe ne semble pas exposerdwFlags
etwShowWindow
, ou au moins pas tout de leurs valeurs valides.OriginalL'auteur mrwaim
De prendre mes repère de @stej réponse ci-dessus, lorsque j'ai trouvé cette question parce que j'essayais de faire la même chose, j'ai élargi pour produire ce code, ce qui portera le script dos au point de savoir si en cours d'exécution dans la société internationale d'ethnobiologie, fenêtre de la console, ou via l'invite de cmd (par le biais d'un fichier de commandes).
Ou de ré-utiliser plus facilement, enregistrer les éléments suivants .psm1 fichier dans votre répertoire de module - de PS v3-delà, vous n'avez pas à l'importer, l'appel d'une fonction dans un module dans votre répertoire de module importations.
Pour importer manuellement,
Import-Module .\Getfocus.psm1
(en Supposant que c'est dans votre chemin d'accès en cours).OriginalL'auteur Graham Gold