Question Tableau de bord VMware

Plus d'informations
il y a 11 ans 4 mois #4511 par Dan
Réponse de Dan sur le sujet Re:Tableau de bord VMware
extra tes fonctions !!
j'arrive a avoir ma fenetre powershell toujours en avant plan en ajoutant juste en debut de script
[code:1]
$hd = getconsolewindow
setwindowpos $hd $cApiWindows.HWND_TOPMOST 10 30 1150 2000
[/code:1]
je vais etudier la partie menu qui semble interessante aussi

par contre je n'arrive pas a faire fonctionner ta fonction
[code:1]
function StayOnTop([IntPtr] $hWnd, [switch] $OFF)
{ #La fenêtre cible reste toujours au premier Plan (Always on top)
$FlagTop=$cApiWindows.HWND_TOPMOST
if ($Off)
{$FlagTop=$cApiWindows.HWND_NOTOPMOST}
#Pas de modification de la taille de la fenêtre ni de la position
[void](SetWindowPos $hWnd $FlagTop 0 0 0 0 ($cApiWindows.Add(\"SWP_NOSIZE\",\"SWP_NOMOVE\",\"SWP_NOZORDER\",\"SWP_NOACTIVATE\",\"SWP_SHOWWINDOW\"«»)) )
}
[/code:1]
toute la partie $cApiWindows.Add annule la mise en avant plan sur mon poste

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 4 mois #4512 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Tableau de bord VMware
Dan écrit:

extra tes fonctions !!

Content qu'elles te soient utiles :)
Dan écrit:

toute la partie $cApiWindows.Add annule la mise en avant plan sur mon poste

A moins que tu l'aies déjà fait, tu peux passer en paramètre directement la valeur.
Sinon comment charge-tu le package ?
De mon coté il est chargé via le profil, donc dans la portée globale.

Je vérifie ça en fin de journée.
Dan écrit:

je vais etudier la partie menu qui semble interessante aussi

Si j'ai le temps je rédigerais un script de démo.

Sous PS V1 on ne peut pas faire grand chose avec car dans la console il n'y a pas de gestion des messages.
C'est dommage car cela aurait été intéressant de pouvoir personnaliser les menus de la console. Ce que propose ISE dans la v2.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 4 mois #4514 par Dan
Réponse de Dan sur le sujet Re:Tableau de bord VMware
Laurent Dardenne écrit:
A moins que tu l'aies déjà fait, tu peux passer en paramètre directement la valeur.
Sinon comment charge-tu le package ?[/quote]

en tapant directement
[code:1]
SetWindowPos $hWnd $FlagTop 0 0 0 0 ($cApiWindows.Add(\"SWP_NOSIZE\",\"SWP_NOMOVE\",\"SWP_NOZORDER\",\"SWP_NOACTIVATE\",\"SWP_SHOWWINDOW\"«»))
[/code:1]
avec les parametres correspondants ca ne fonctionne pas
par contre juste avec
[code:1]
SetWindowPos $hWnd $FlagTop w x y z
[/code:1] (je dois entrer des valeurs pour wxyz sinon la fenetre se reduit a en devenir invisible)ca fonctionne
mais c'est peut etre une mauvaise utilisation de ma part
je ne maitrise pas du tout ces api donc j'avance de facon empirique

je charge les packages directement dans le profil aussi et j'utilise la v2 ctp de powershell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 4 mois #4519 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Tableau de bord VMware
Dan écrit:

je ne maitrise pas du tout ces api donc j'avance de facon empirique

Logiquement les bibliothèques associées langages de haut niveau propose des méthodes les encapsulant, telles que Hide,Show,StayOntop, etc. On les utilise pour obtenir un comportement bien spécifique, il y en a certaine qui sont assez retors.

Après quelques tests, il avait effectivement non pas un mais plusieurs bug.
Le premier, dans la construction de l'objet $cApiWindows certaines valeurs sont de type Handle et pas Integer, valeur par défaut sous PowerShell. On doit donc déclarer certaines valeurs, propres à l'API SetWindowPos, dans un type précis :
[code:1]
HWND_TOP=0 -as [Intptr]
[/code:1]
Comme quoi le dynamisme c'est bien mais le typage c'est pas mal non plus ;-)
C'est à dire que l'appel suivant :
[code:1]
SetWindowPos $PSWindowHandle (-1 -as [int32]) 0 0 0 0 3
[/code:1]
ne pose pas de pb pour PowerShell avec la signature ci-dessous:
[code:1]
function SetWindowPos([IntPtr] $hWnd, [IntPtr] $hWndInsertAfter, [Int32] $X, [Int32] $Y, [Int32] $cx, [Int32] $cy, [UInt32] $uFlags)
[/code:1]
Pour le portage d'API \"il faut\" juste avoir à l'esprit ce comportement, j'ai loupé une marche sur ce coup là...
De plus j'avais dû éteindre la lumiére lorsque j'ai descendu l'escalier car la function suivante avait aussi qq soucis :
[code:1]
function StayOnTop([IntPtr] $WindowHandle=$PSWindowHandle, [switch] $OFF)
{ #La fenêtre cible reste toujours au premier Plan (Always on top)
[IntPtr]$FlagTop=$cApiWindows.HWND_TOPMOST
if ($Off)
{$FlagTop=$cApiWindows.HWND_NOTOPMOST}
[Uint32] $Uflags=$cApiWindows.Add(\"SWP_NOSIZE\",\"SWP_NOMOVE\",\"SWP_NOOWNERZORDER\",\"SWP_NOACTIVATE\"«»)
#Pas de modification de la taille de la fenêtre ni de la position
[void](SetWindowPos $WindowHandle $FlagTop 0 0 0 0 $Uflags )
}
[/code:1]
Joli roulé-boulé ;-)
J'ai précisé les types,modifier les flags et utilise par défaut le handle de la console de PowerShell

Pour la fonction $cApiWindows.Add ici aussi il s'agit d'un pb de typage, mais c'est surtout \"un problème d'usage\", c'est à dire que par défaut PS renvoi un int32, cette fonction aussi.
On doit donc, si on l'utilise préciser le type du résultat. Ici ce n'est pas le cas mais selon l'API on peut avoir besoin de récupérer un entier signé ou non.
Du coup je ne sais pas si j'ajoute une version de cette méthode renvoyant un entier signée et une pour les entiers non signée ou si je la supprime.
Mais même dans ce cas le problème du typage demeure :
[code:1]
[Uint32] $Uflags=531
[void](SetWindowPos $WindowHandle $FlagTop 0 0 0 0 $Uflags )
}
[/code:1]
Dans ce cas un entier ne poserais pas de pb mais mieux vaut s'en assurer explicitement.
De plus je n'ai testé que sur PS v1-v2 en 32 bits mais pas en 64 bits.

Je te remercie pour ton retour, j'avais prêté une attention particulière sur les signatures des méthodes de ces API mais pas sur cette méthode.
Je te joins le package provisoire corrigé en attendant de contrôler le reste des valeurs portées par la variable $cApiWindows.

La pièce jointe PackageWindowsFunctions-c8516c03f25e37d596cb4f1c5990bc2b.ps1 est absente ou indisponible


Tutoriels PowerShell
Pièces jointes :

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 4 mois #4523 par Dan
Réponse de Dan sur le sujet Re:Tableau de bord VMware
Laurent Dardenne écrit:

Je te remercie pour ton retour, j'avais prêté une attention particulière sur les signatures des méthodes de ces API mais pas sur cette méthode.


mais je t'en prie d'ailleurs je profite très largement du resultat :woohoo:

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 11 ans 4 mois #4527 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Tableau de bord VMware
Une version corrigée, le code utilisant ce package n'est pas pas impacté.

Corrections:
Pour
[code:1]
HWND_TOP=0 -as [Intptr]
[/code:1]
l'approche suivante est préférable
[code:1]
HWND_TOP=[Intptr]0
[/code:1]
car pour cette valeur
[code:1]
WS_POPUP =0x80000000 -as [UInt32]
[/code:1]
On récupére une valeur $NULL sans déclencher d'exception lors de sa déclaration.

Lors de la construction du membre le type était figé en [int32]
[code:1]$C3=\"-value {[Int32] $($_.Value)}\"[/code:1]
Désormais on peut créer plusieurs variables constantes basées sur le même principe :
[code:1]
function Set-Constant( [string] $VariableName, [HashTable] $Data, [String] $Description, [Int32] $Scope=1)
{ #Crée une variable constante de nom $VariableName dans la portée de l'appelant
#La variable est créé par défaut dans la portée de l'appelant, sinon dans celle précisée par $Scope
#
#Exemple :
# $Const=@{
# NomConstante=[Intptr] 567}
# Set-Constant \"cConst\" $Const \"Constantes test\"
#
#Pour chaque entrée de la hashtable $DATA on crée un membre de type ScriptProperty en lecture seule :
# cConst.NomConstante {get=[System.IntPtr] 567;set=Throw \"La propriété NomConstante est en lecture seule.\";}
#
#Pour retrouver les constantes : dir variable:c*|Where { (gv $_.name).options -match \"constant\"}
...
[/code:1]
Ensuite la gestion du type [Uint32] n'est pas facilité sous PowerShell V1:

Version 1 of PowerShell doen't natively support unsigned types.

Bruce payette
le code suivant n'est pas possible:
[code:1][UInt32](\"0x80000000\" -bor 0x00800000 -bor 0x00080000)
[/code:1]
On doit caster des entiers 64 bits vers un entier 32 bits non-signé :
[code:1]
[uint32](0x80000000L + 0x00800000L + 0x00080000L)[/code:1]
Ce point là, le typage, me semble réglé.
Thanks to Medinoc
:)

[edit]
La function StayTopOff fonctionne
[code:1]
#La console reste au premier plan
StayOnTop
#La console ne reste plus au premier plan
StayOnTop -off[/code:1]

La pièce jointe PackageWindowsFunctions-8dba1ab1e0d8669e086eadf6c3205ccd.ps1 est absente ou indisponible

<br><br>Message édité par: Laurent Dardenne, à: 5/04/09 18:25

Tutoriels PowerShell
Pièces jointes :

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.283 secondes
Propulsé par Kunena