Question
Cacher la console PS lors du lancement d'une form
- Bredin Samuel
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 52
- Remerciements reçus 0
il y a 17 ans 4 mois #3134
par Bredin Samuel
Cacher la console PS lors du lancement d'une form a été créé par Bredin Samuel
Bonjour,
Peut-être que quelqu'un pourrait m'aider ?
Je voudrais dans un de mes scripts (PowerShell 1.0) que lorsque je lance une Forms la console soit cachée.
Ou peut être réussir à créer une Forms autonome.<br><br>Message édité par: Arnaud, à: 31/10/08 14:13
Peut-être que quelqu'un pourrait m'aider ?
Je voudrais dans un de mes scripts (PowerShell 1.0) que lorsque je lance une Forms la console soit cachée.
Ou peut être réussir à créer une Forms autonome.<br><br>Message édité par: Arnaud, à: 31/10/08 14:13
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 17 ans 4 mois #3151
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Utilisation Forms
Mephisto écrit:
C'est basé sur des API Win32, Je recherche ça.
Je dois avoir qq chose sur le sujet dans mes archives,Je voudrais dans un de mes scripts (PowerShell 1.0) que lorsque je lance une Forms la console soit cacher.
C'est basé sur des API Win32, Je recherche ça.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 17 ans 4 mois #3152
par Arnaud Petitjean
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Réponse de Arnaud Petitjean sur le sujet Re:Utilisation Forms
Salut Mephisto,
Regarde ma réponse dans ce fil de discussion . C'est un peu de la bidouille mais ça fonctionne très bien.
Arnaud
Regarde ma réponse dans ce fil de discussion . C'est un peu de la bidouille mais ça fonctionne très bien.
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 17 ans 4 mois #3154
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Utilisation Forms
Salut Arnaud,
Arnaud écrit:
Il existe des API de manipulation de fenêtre autant les utiliser, bon dans ce cas on est plus dans du développement que dans du scripting, quoi que.
Une solution d'appel d'API, en attendant la V2 :
[code:1]
## Invoke a Win32 P/Invoke call.
## From: Lee Holmes
## www.leeholmes.com/blog/GetTheOwnerOfAPro...efOutParameters.aspx
function Invoke-Win32([string] $dllName, [Type] $returnType,
[string] $methodName, [Type[]] $parameterTypes, [Object[]] $parameters)
{
## Begin to build the dynamic assembly
$domain = [AppDomain]::CurrentDomain
$name = New-Object Reflection.AssemblyName 'PInvokeAssembly'
$assembly = $domain.DefineDynamicAssembly($name, 'Run')
$module = $assembly.DefineDynamicModule('PInvokeModule')
$type = $module.DefineType('PInvokeType', \"Public,BeforeFieldInit\"«»)
## Go through all of the parameters passed to us. As we do this,
## we clone the user's inputs into another array that we will use for
## the P/Invoke call.
$inputParameters = @()
$refParameters = @()
for($counter = 1; $counter -le $parameterTypes.Length; $counter++)
{
## If an item is a PSReference, then the user
## wants an [out] parameter.
if($parameterTypes[$counter - 1] -eq [Ref])
{
## Remember which parameters are used for [Out] parameters
$refParameters += $counter
## On the cloned array, we replace the PSReference type with the
## .Net reference type that represents the value of the PSReference,
## and the value with the value held by the PSReference.
$parameterTypes[$counter - 1] =
$parameters[$counter - 1].Value.GetType().MakeByRefType()
$inputParameters += $parameters[$counter - 1].Value
}
else
{
## Otherwise, just add their actual parameter to the
## input array.
$inputParameters += $parameters[$counter - 1]
}
}
## Define the actual P/Invoke method, adding the [Out]
## attribute for any parameters that were originally [Ref]
## parameters.
$method = $type.DefineMethod($methodName, 'Public,HideBySig,Static,PinvokeImpl',
$returnType, $parameterTypes)
foreach($refParameter in $refParameters)
{
$method.DefineParameter($refParameter, \"Out\", $null)
}
## Apply the P/Invoke constructor
$ctor = [Runtime.InteropServices.DllImportAttribute].GetConstructor([string])
$attr = New-Object Reflection.Emit.CustomAttributeBuilder $ctor, $dllName
$method.SetCustomAttribute($attr)
## Create the temporary type, and invoke the method.
$realType = $type.CreateType()
$realType.InvokeMember($methodName, 'Public,Static,InvokeMethod', $null, $null,
$inputParameters)
## Finally, go through all of the reference parameters, and update the
## values of the PSReference objects that the user passed in.
foreach($refParameter in $refParameters)
{
$parameters[$refParameter - 1].Value = $inputParameters[$refParameter - 1]
}
}
[/code:1]
Ensuite on utilise l'api ShowWindows, comme ici .
Ce qui nous donne l'adaptation suivante :
[code:1]
function ShowWindowAsync([IntPtr] $hWnd, [Int32] $nCmdShow)
{
$parameterTypes = [IntPtr], [Int32]
$parameters = $hWnd, $nCmdShow
Invoke-Win32 \"user32.dll\" ([Boolean]) \"ShowWindowAsync\" $parameterTypes $parameters
}
function Show-PowerShell() {
$null = ShowWindowAsync $myWindowHandle 1
}
function Hide-PowerShell() {
$null = ShowWindowAsync $myWindowHandle 0
}
function Minimize-PowerShell() {
$null = ShowWindowAsync $myWindowHandle 2
}
[/code:1]
J'ai essayé il y qq semaine d'adapter ce code de cette manière :
[code:1]
#Code de test
function Hide-PowerShell() {
$null = ShowWindowAsync (Get-Process –id $pid).MainWindowHandle 0
}
function Show-PowerShell() {
$null = ShowWindowAsync (Get-Process –id $pid).MainWindowHandle 1
}
[/code:1]
Le problème avec ce code est que si on minimize la fenêtre cela fonctionne mais si on la cache on ne peut plus la réafficher, un peu gênant.
Après + heures d'essai j'ai donc laissé tombé. Aujourd'hui en recherchant à nouveau sur le net, je suis tombé sur ce post.
J'ai tout de suite compris mon erreur, MainWindowHandle n'est plus renseigné si la fenêtre est \"caché\" :
[code:1]
start-transcript
Write-host \"avant\"
(Get-Process –id $pid).MainWindowHandle
# renvoi 2294746
Hide-PowerShell
Write-host \"après\"
(Get-Process –id $pid).MainWindowHandle
# renvoi 0
[/code:1]
On doit mémoriser dans une globale le handle de la console.
Ensuite cela va tout de suite mieux
[code:1]
$myWindowHandle = (Get-Process -Id $pid).MainWindowHandle
start-transcript
# Cache la fenêtre PowerShell
Hide-PowerShell
sleep 2
# Restaure la fenêtre PowerShell
Show-PowerShell;
Write-host \"Ok\"
#
[/code:1]
Pour un usage avec une Winform:
[code:1]
$myWindowHandle = (Get-Process -Id $pid).MainWindowHandle
# code généré à l'aide de Convert-Form.ps1
...
$Form1.Add_Shown({Hide-PowerShell;$Form1.Activate()})
$Form1.ShowDialog()
#Libération des ressources
$Form1.Dispose()
Show-PowerShell;
[/code:1]
Et ça marche!
Pratique les API
ps:
Je vais ajouter cette fonctionnalité dans Convert-Form dés que je peux, je vais attendre un peu vos retours et tests sur le code proposé ici.
Ce site ( www.pinvoke.net/ ) référence les signatures dotNET de nombreuses API Win32 ne vous en privez pas.
Message édité par: Laurent Dardenne, à: 31/10/08 15:29
Arnaud écrit:
C'est une solution mais l'inconvénient est qu'il faut passer soit par un raccourci soit par la création d'un second process et la restauration ne semble pas possible.C'est un peu de la bidouille mais ça fonctionne très bien.
Il existe des API de manipulation de fenêtre autant les utiliser, bon dans ce cas on est plus dans du développement que dans du scripting, quoi que.
Une solution d'appel d'API, en attendant la V2 :
[code:1]
## Invoke a Win32 P/Invoke call.
## From: Lee Holmes
## www.leeholmes.com/blog/GetTheOwnerOfAPro...efOutParameters.aspx
function Invoke-Win32([string] $dllName, [Type] $returnType,
[string] $methodName, [Type[]] $parameterTypes, [Object[]] $parameters)
{
## Begin to build the dynamic assembly
$domain = [AppDomain]::CurrentDomain
$name = New-Object Reflection.AssemblyName 'PInvokeAssembly'
$assembly = $domain.DefineDynamicAssembly($name, 'Run')
$module = $assembly.DefineDynamicModule('PInvokeModule')
$type = $module.DefineType('PInvokeType', \"Public,BeforeFieldInit\"«»)
## Go through all of the parameters passed to us. As we do this,
## we clone the user's inputs into another array that we will use for
## the P/Invoke call.
$inputParameters = @()
$refParameters = @()
for($counter = 1; $counter -le $parameterTypes.Length; $counter++)
{
## If an item is a PSReference, then the user
## wants an [out] parameter.
if($parameterTypes[$counter - 1] -eq [Ref])
{
## Remember which parameters are used for [Out] parameters
$refParameters += $counter
## On the cloned array, we replace the PSReference type with the
## .Net reference type that represents the value of the PSReference,
## and the value with the value held by the PSReference.
$parameterTypes[$counter - 1] =
$parameters[$counter - 1].Value.GetType().MakeByRefType()
$inputParameters += $parameters[$counter - 1].Value
}
else
{
## Otherwise, just add their actual parameter to the
## input array.
$inputParameters += $parameters[$counter - 1]
}
}
## Define the actual P/Invoke method, adding the [Out]
## attribute for any parameters that were originally [Ref]
## parameters.
$method = $type.DefineMethod($methodName, 'Public,HideBySig,Static,PinvokeImpl',
$returnType, $parameterTypes)
foreach($refParameter in $refParameters)
{
$method.DefineParameter($refParameter, \"Out\", $null)
}
## Apply the P/Invoke constructor
$ctor = [Runtime.InteropServices.DllImportAttribute].GetConstructor([string])
$attr = New-Object Reflection.Emit.CustomAttributeBuilder $ctor, $dllName
$method.SetCustomAttribute($attr)
## Create the temporary type, and invoke the method.
$realType = $type.CreateType()
$realType.InvokeMember($methodName, 'Public,Static,InvokeMethod', $null, $null,
$inputParameters)
## Finally, go through all of the reference parameters, and update the
## values of the PSReference objects that the user passed in.
foreach($refParameter in $refParameters)
{
$parameters[$refParameter - 1].Value = $inputParameters[$refParameter - 1]
}
}
[/code:1]
Ensuite on utilise l'api ShowWindows, comme ici .
Ce qui nous donne l'adaptation suivante :
[code:1]
function ShowWindowAsync([IntPtr] $hWnd, [Int32] $nCmdShow)
{
$parameterTypes = [IntPtr], [Int32]
$parameters = $hWnd, $nCmdShow
Invoke-Win32 \"user32.dll\" ([Boolean]) \"ShowWindowAsync\" $parameterTypes $parameters
}
function Show-PowerShell() {
$null = ShowWindowAsync $myWindowHandle 1
}
function Hide-PowerShell() {
$null = ShowWindowAsync $myWindowHandle 0
}
function Minimize-PowerShell() {
$null = ShowWindowAsync $myWindowHandle 2
}
[/code:1]
J'ai essayé il y qq semaine d'adapter ce code de cette manière :
[code:1]
#Code de test
function Hide-PowerShell() {
$null = ShowWindowAsync (Get-Process –id $pid).MainWindowHandle 0
}
function Show-PowerShell() {
$null = ShowWindowAsync (Get-Process –id $pid).MainWindowHandle 1
}
[/code:1]
Le problème avec ce code est que si on minimize la fenêtre cela fonctionne mais si on la cache on ne peut plus la réafficher, un peu gênant.
Après + heures d'essai j'ai donc laissé tombé. Aujourd'hui en recherchant à nouveau sur le net, je suis tombé sur ce post.
J'ai tout de suite compris mon erreur, MainWindowHandle n'est plus renseigné si la fenêtre est \"caché\" :
[code:1]
start-transcript
Write-host \"avant\"
(Get-Process –id $pid).MainWindowHandle
# renvoi 2294746
Hide-PowerShell
Write-host \"après\"
(Get-Process –id $pid).MainWindowHandle
# renvoi 0
[/code:1]
On doit mémoriser dans une globale le handle de la console.
Ensuite cela va tout de suite mieux
[code:1]
$myWindowHandle = (Get-Process -Id $pid).MainWindowHandle
start-transcript
# Cache la fenêtre PowerShell
Hide-PowerShell
sleep 2
# Restaure la fenêtre PowerShell
Show-PowerShell;
Write-host \"Ok\"
#
[/code:1]
Pour un usage avec une Winform:
[code:1]
$myWindowHandle = (Get-Process -Id $pid).MainWindowHandle
# code généré à l'aide de Convert-Form.ps1
...
$Form1.Add_Shown({Hide-PowerShell;$Form1.Activate()})
$Form1.ShowDialog()
#Libération des ressources
$Form1.Dispose()
Show-PowerShell;
[/code:1]
Et ça marche!
Pratique les API
ps:
Je vais ajouter cette fonctionnalité dans Convert-Form dés que je peux, je vais attendre un peu vos retours et tests sur le code proposé ici.
Ce site ( www.pinvoke.net/ ) référence les signatures dotNET de nombreuses API Win32 ne vous en privez pas.
Message édité par: Laurent Dardenne, à: 31/10/08 15:29
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 17 ans 4 mois #3155
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Utilisation Forms
Les possibles valeurs du paramètre nCmdShow de l'API ShowWindowAsync
[code:1]
# Valeurs possibles de $nCmdShow
# SW_HIDE = 0;
# SW_SHOWNORMAL = 1;
# SW_NORMAL = 1;
# SW_SHOWMINIMIZED = 2;
# SW_SHOWMAXIMIZED = 3;
# SW_MAXIMIZE = 3;
# SW_SHOWNOACTIVATE = 4;
# SW_SHOW = 5;
# SW_MINIMIZE = 6;
# SW_SHOWMINNOACTIVE = 7;
# SW_SHOWNA = 8;
# SW_RESTORE = 9;
# SW_SHOWDEFAULT = 10;
# SW_MAX = 10
[/code:1]
[code:1]
# Valeurs possibles de $nCmdShow
# SW_HIDE = 0;
# SW_SHOWNORMAL = 1;
# SW_NORMAL = 1;
# SW_SHOWMINIMIZED = 2;
# SW_SHOWMAXIMIZED = 3;
# SW_MAXIMIZE = 3;
# SW_SHOWNOACTIVATE = 4;
# SW_SHOW = 5;
# SW_MINIMIZE = 6;
# SW_SHOWMINNOACTIVE = 7;
# SW_SHOWNA = 8;
# SW_RESTORE = 9;
# SW_SHOWDEFAULT = 10;
# SW_MAX = 10
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Bredin Samuel
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 52
- Remerciements reçus 0
il y a 17 ans 4 mois #3177
par Bredin Samuel
Réponse de Bredin Samuel sur le sujet Re:Utilisation Forms
Merci Laurent pour toutes ces infos.
Je teste cette après midi et je fais un retour.
Je teste cette après midi et je fais un retour.
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.056 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Cacher la console PS lors du lancement d'une form