Pour résoudre ce problème, je propose d'utiliser un script en Csharp inclu dans le code Powershell.
Dans Powershell : Je définit un type personnalisé (Add-Type) pour y inclure mon code Csharp.
Dans CSharp : La fonction "MessageBox" permet de déclarer le handle de la fenêtre parent.
Je vais donc attacher mon "MessageBox" à une nouvelle fenêtre que je vais forcer au premier plan.
A noter :
Les MessagesBox utilisent la Dll "SystemWindowsForms.dll".
Il faut penser à la déclarer le chemin de la Dll avec l'option "-ReferencedAssemblies".
#######################################################################
# #
# MessageBox TopMost - V1.0.0 #
# #
# Par Olivier DELORME #
# Site https://powershell.sekki.fr #
# #
#######################################################################
#Assembly
[void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
#Csharp
try { [void][Sekki.Csharp] }
catch{
Add-Type -TypeDefinition @"
using System;
using System.Windows;
using System.Windows.Forms;
namespace Sekki
{
public class Csharp
{
public static void MessageBoxA(string message, string title, MessageBoxIcon iconbox)
{
MessageBox.Show(new Form(){TopMost=true, TopLevel=true}, message, title, MessageBoxButtons.OK, iconbox);
}
public static string MessageBoxB(string message, string title, MessageBoxButtons buttonbox, MessageBoxIcon iconbox)
{
DialogResult result;
result = MessageBox.Show(new Form(){TopMost=true, TopLevel=true}, message, title, buttonbox, iconbox);
if (result == System.Windows.Forms.DialogResult.Abort) { return "Abort"; }
if (result == System.Windows.Forms.DialogResult.Cancel) { return "Cancel"; }
if (result == System.Windows.Forms.DialogResult.Ignore) { return "Ignore"; }
if (result == System.Windows.Forms.DialogResult.No) { return "No"; }
if (result == System.Windows.Forms.DialogResult.OK) { return "OK"; }
if (result == System.Windows.Forms.DialogResult.Retry) { return "Retry"; }
if (result == System.Windows.Forms.DialogResult.Yes) { return "Yes"; }
return "None";
}
}
}
"@ -Language CSharp -ReferencedAssemblies System.Windows.Forms
}
#Exemple 1 :
$text = "Voulez-vous adopter un chat ?"
$BoutonBox = [Windows.Forms.MessageBoxButtons]::YesNo
$titre = "Sekki Powershell - Choix"
$IconBox = [windows.forms.MessageBoxIcon]::Question
[Sekki.Csharp]::MessageBoxB($text,$titre,$BoutonBox,$IconBox)
#Exemple 2 :
$text = "Attention chat adorable !"
$titre = "Sekki Powershell - Alerte"
$IconBox = [windows.forms.MessageBoxIcon]::Warning
[Sekki.Csharp]::MessageBoxA($text,$titre,$IconBox)
# #
# MessageBox TopMost - V1.0.0 #
# #
# Par Olivier DELORME #
# Site https://powershell.sekki.fr #
# #
#######################################################################
#Assembly
[void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
#Csharp
try { [void][Sekki.Csharp] }
catch{
Add-Type -TypeDefinition @"
using System;
using System.Windows;
using System.Windows.Forms;
namespace Sekki
{
public class Csharp
{
public static void MessageBoxA(string message, string title, MessageBoxIcon iconbox)
{
MessageBox.Show(new Form(){TopMost=true, TopLevel=true}, message, title, MessageBoxButtons.OK, iconbox);
}
public static string MessageBoxB(string message, string title, MessageBoxButtons buttonbox, MessageBoxIcon iconbox)
{
DialogResult result;
result = MessageBox.Show(new Form(){TopMost=true, TopLevel=true}, message, title, buttonbox, iconbox);
if (result == System.Windows.Forms.DialogResult.Abort) { return "Abort"; }
if (result == System.Windows.Forms.DialogResult.Cancel) { return "Cancel"; }
if (result == System.Windows.Forms.DialogResult.Ignore) { return "Ignore"; }
if (result == System.Windows.Forms.DialogResult.No) { return "No"; }
if (result == System.Windows.Forms.DialogResult.OK) { return "OK"; }
if (result == System.Windows.Forms.DialogResult.Retry) { return "Retry"; }
if (result == System.Windows.Forms.DialogResult.Yes) { return "Yes"; }
return "None";
}
}
}
"@ -Language CSharp -ReferencedAssemblies System.Windows.Forms
}
#Exemple 1 :
$text = "Voulez-vous adopter un chat ?"
$BoutonBox = [Windows.Forms.MessageBoxButtons]::YesNo
$titre = "Sekki Powershell - Choix"
$IconBox = [windows.forms.MessageBoxIcon]::Question
[Sekki.Csharp]::MessageBoxB($text,$titre,$BoutonBox,$IconBox)
#Exemple 2 :
$text = "Attention chat adorable !"
$titre = "Sekki Powershell - Alerte"
$IconBox = [windows.forms.MessageBoxIcon]::Warning
[Sekki.Csharp]::MessageBoxA($text,$titre,$IconBox)