UDF > WinAPIEx > System > Station & Desktop >


_WinAPI_CreateDesktop

Crée un nouveau bureau, et l'associe à la station window actuelle du processus appelant

#include <WinAPISys.au3>
_WinAPI_CreateDesktop ( $sName [, $iAccess = 0x0002 [, $iFlags = 0 [, $iHeap = 0 [, $tSecurity = 0]]]] )

Paramètres

$sName Le nom du bureau à créer. Les noms de bureau sont insensibles à la casse et ne peuvent pas contenir de barre oblique inverse (\).
$iAccess [optionnel] L'accès demandé sur le bureau. Ce paramètre peut prendre une ou plusieurs des valeurs suivantes:
    $DESKTOP_ALL_ACCESS
    $DESKTOP_CREATEMENU
    $DESKTOP_CREATEWINDOW (par défaut)
    $DESKTOP_ENUMERATE
    $DESKTOP_HOOKCONTROL
    $DESKTOP_JOURNALPLAYBACK
    $DESKTOP_JOURNALRECORD
    $DESKTOP_READOBJECTS
    $DESKTOP_SWITCHDESKTOP
    $DESKTOP_WRITEOBJECTS
$iFlags [optionnel] Les flags optionnels. Peut prendre la valeur zéro ou la valeur suivante:
    $DF_ALLOWOTHERACCOUNTHOOK
$iHeap [optionnel] La taille du bureau sur le tas, en kilo-octets. Par défaut, 0.
$tSecurity [optionnel] La structure $tagSECURITY_ATTRIBUTES qui détermine si le handle retourné peut être hérité par les processus enfants.
Si ce paramètre est 0 (par défaut), le handle ne peut pas être hérité.

Valeur de retour

Succès: Retourne le handle du bureau nouvellement créé. Si le bureau spécifié existe déjà, la fonction réussit et retourne le handle du bureau existant.
Échec: Retourne 0, appelez _WinAPI_GetLastError() pour obtenir des informations sur l'erreur.

Remarques

Le nombre de bureaux qui peuvent être créés est limité par la taille du tas système pour les bureaux.
Vous pouvez augmenter le nombre de bureaux qui peuvent être créés en augmentant de la taille du tas pour les bureaux ou en réduisant le tas par défaut réservé pour chaque bureau dans la station window interactive.
La taille par défaut du tas réservé à un bureau dépend de facteurs tels que l'architecture matérielle.
Pour récupérer la taille du tas, appelez la fonction _WinAPI_GetUserObjectInformation() avec $UOI_HEAPSIZE.

Lorsque vous avez fini d'utiliser un bureau, appelez la fonction _WinAPI_CloseDesktop() pour le fermer.

En relation

_WinAPI_CloseDesktop, _WinAPI_GetUserObjectInformation

Voir aussi

Consultez CreateDesktopEx dans la librairie MSDN.

Exemple

#include <APIProcConstants.au3>
#include <APISysConstants.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIMem.au3>
#include <WinAPIProc.au3>
#include <WinAPISys.au3>

; Récupére le handle du bureau actuel et crée un nouveau bureau nommé "MyDesktop"
Local $hPrev = _WinAPI_GetThreadDesktop(_WinAPI_GetCurrentThreadId())
Local $hDesktop = _WinAPI_CreateDesktop('MyDesktop', BitOR($DESKTOP_CREATEWINDOW, $DESKTOP_SWITCHDESKTOP))
If Not $hDesktop Then
    MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Error', 'Unable to create desktop.')
    Exit
EndIf

; Bascule sur le bureau nouvellement créé
_WinAPI_SwitchDesktop($hDesktop)

; Exécute "calc.exe" sur "MyDesktop" et attend jusqu'à ce qu'un processus soit fermé par l'utilisateur
Local $pText = _WinAPI_CreateString('MyDesktop')
Local $tProcess = DllStructCreate($tagPROCESS_INFORMATION)
Local $tStartup = DllStructCreate($tagSTARTUPINFO)
DllStructSetData($tStartup, 'Size', DllStructGetSize($tStartup))
DllStructSetData($tStartup, 'Desktop', $pText)
If _WinAPI_CreateProcess('', @SystemDir & '\calc.exe', 0, 0, 0, $CREATE_NEW_PROCESS_GROUP, 0, 0, DllStructGetPtr($tStartup), DllStructGetPtr($tProcess)) Then
    ProcessWaitClose(DllStructGetData($tProcess, 'ProcessID'))
EndIf

; Bascule sur le bureau précédent et ferme "MyDesktop"
_WinAPI_SwitchDesktop($hPrev)
_WinAPI_CloseDesktop($hDesktop)

; Libère la mémoire allouée pour une chaîne
_WinAPI_FreeMemory($pText)