Project

General

Profile

Fonction Invoke-Win32

function Invoke-Win32([string] $dllName, [Type] $returnType,  
   [string] $methodName, [Type[]] $parameterTypes, [Object[]] $parameters)

Cette fonction génère un appel à une API Win32, elle utilise les conventions d'appel de P/Invoke de dotnet.

Ce site vous aidera à compléter la liste des API disponibles dans le package PackageWindowsFunctions.ps1.

 #Fonction utilisateur
Function Hide-PsWindow([Intptr] $Windowhandle=$Pswindowhandle) {
#cache la fenêtre possédant le handle windowhandle
#l'application n'est plus disponible dans la barre de tâches nid dans le gestionnaire de tâches.   

   $Null = ShowWindowAsync $Windowhandle $cAPIWindows.Sw_Hide  
}

 #API Windows
Function ShowWindowAsync([Intptr] $Hwnd, [Int32] $Ncmdshow)
{
    $Parametertypes = [Intptr], [Int32] 
    $Parameters = $Hwnd, $Ncmdshow

    Invoke-Win32 "User32.Dll" ([Boolean]) "ShowWindowAsync" $Parametertypes $Parameters
}

Comment ajouter une nouvelle API

Retrouver la signature de l'api ciblée

BOOL ShowWindowAsync(          
     HWND hWnd,
     int nCmdShow
);

Déclarer la fonction PowerShell

Function ShowWindowAsync([Intptr] $Hwnd, [Int32] $Ncmdshow)

Les paramètres reprennent les noms de l'api et sont contraints sur le type.

On utilise les types :

  • IntPtr pour les handles Windows,
  • Int32 pour int,
  • Uint32 pour uint,
  • [Ref] pour la convention [out], paramètre en sortie seulement, c'est donc un pointeur.

Certaines constructions doivent se faire en utilisant le type Long, casté en Uint32 :

      #(ws_popup or ws_border or ws_sysmenu)
      # *** construction impossible : [uint32]("0x80000000" -bor 0x00800000 -bor 0x00080000) ***
   Ws_Popupwindow =[Uint32](0x80000000L + 0x00800000L + 0x00080000L)

Attention : "Version 1 Of Powershell Doen't Natively Support Unsigned Types.",Bruce Payette.
 

Préciser le type des paramètres

    $Parametertypes = [Intptr], [Int32] 

On reprend dans l'ordre le type des paramètres donné dans la signature de la fonction PowerShell.

Construire le tableau des paramètres

    $Parameters = $Hwnd, $Ncmdshow

On reprend dans l'ordre les variables indiquées dans la signature de la fonction PowerShell.

Construire l'appel P/Invoke via Invoke-Win32

    Invoke-Win32 "User32.Dll" ([Boolean]) "ShowWindowAsync" $Parametertypes $Parameters

On indique dans l'ordre
  • le nom de la dll hébergeant cette API,
  • le type de retour de la fonction,
  • le tableau des types,
  • le tableau des valeurs à passer.

Sauvergardez tous vos travaux, puis testez l'appel.

Gestion des erreurs

La gestion des erreurs des API Win32 via l'appel à

 [System.Runtime.InteropServices.Marshal]::GetLastWin32Error() 

ne fonctionne pas avec cette fonction, car par défaut elle construit l'attribut DllImportAttribute avec la valeur par défaut pour le champ SetLastError :
true pour indiquer que l'appelé appellera SetLastError ; sinon false. 
La valeur par défaut est false, sauf en Visual Basic. 

Le marshaleur runtime appelle GetLastError et met en mémoire cache la valeur retournée pour empêcher qu'elle soit remplacée par d'autres appels API. Pour récupérer le code d'erreur, vous pouvez appeler GetLastWin32Error.

Comme dans ce ce cas la valeur n'est pas mise en cache on récupère n'importe quoi comme code erreur.