samedi 22 juin 2024

MessageBox TopMost (Csharp)

Aujourd'hui je vous propose de résoudre le problème suivant : "MessageBox" ne pop pas au premier plan !
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)