Question [Fonction]Remove-GridView

Plus d'informations
il y a 14 ans 3 mois #10734 par Laurent Dardenne
Salut,
je vous propose une ébauche de fonction complétant le cmdlet Out-GridView.
Celui-ci affiche des informations au sein d'une grille hébergée dans une fenêtre WPF.
On peut qq fois avoir besoin d'afficher une dizaine de groupes de données dans autant de fenêtres, l'inconvénient est qu'on doit supprimer manuellement ces fenêtres une à une .
Pour effectuer cette opération en une seule fois, la solution consiste à envoyer un message windows WM_Close à chacune d'elle.

Un exemple :
[code:1]
$Grp=Get-Process|
Where-Object {$_.Name -eq \"svchost\"}|
Select-Object Name,Modules
$I=1
# Le nommage est ici impératif
$Grp|
Foreach-Object {
$Name=\"$($_.Name)-$(($i++))\"
$_.Modules|
Out-GridView -Title $Name
}
[/code:1]
Le code (Win32/PInvoke) d'émission du message :
[code:1]
$signature = @'
static uint WM_CLOSE = 0x10;

[DllImport(\"user32.dll\", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

[DllImport(\"user32.dll\", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport(\"user32.dll\", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr hwndParent,IntPtr hwndChildAfter,string lpClass, string lpWindow);

public static IntPtr FindWindow(string windowName){
return FindWindow(null,windowName);
}

public static IntPtr FindWindowEx(IntPtr hwndParent,string lpClass,string windowName){
return FindWindowEx(hwndParent,System.IntPtr.Zero,lpClass,windowName);
}

public static void CloseOutGridView(string windowName){
IntPtr handle=FindWindow(windowName);
SendMessage(handle, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
}
'@

$null = Add-Type -MemberDefinition $signature -name Windows -namespace Win32Functions -PassThru
[/code:1]
L'appel de la fonction supprimant les fenêtres :
[code:1]
$I=1
#Si deux fenêtres portent le même nom, une seule sera traitée.
# On DOIT connaitre le titre de la fenêtre
$Grp|
Foreach-Object {
$Name=\"$($_.Name)-$(($i++))\"
[Win32Functions.Windows]::CloseOutGridView($Name)
}
[/code:1]
Cette approche clôt toutes les fenêtres créées par et dans le process Powershell.

Le problème avec Out-GridView est qu'on ne peut pas émettre un message pour un type de fenêtre uniquement, car ce cmdlet (WPF) crée un type de fenêtre unique à chaque appel.
Ce point reste à confirmer.
Testé sous XP sp3 32 bits + PS V2 Fr<br><br>Message édité par: Laurent Dardenne, à: 9/12/11 17:34

Tutoriels PowerShell

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

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