Viktor1703
AutoIT Гуру
- Сообщения
- 1,535
- Репутация
- 413
Строго не судите, 1й раз пробую, тестировалось только на XP, на других системах не знаю как себя поведёт, если что - то пропустил в коде, типа освободить память перед завершением или ещё что - то, то это делалось на быструю руку, в XP работает нормально, скрипт через 10 секунд закрывает 2й рабочий стол и переключается на дефолтный.
Код:
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>
Global $hDesk = CreateDesktop('MyDesktop')
If (@error) Or (Not $hDesk) Then
Exit
EndIf
If $hDesk Then
CreateExplorer('MyDesktop') ; Включаем Explorer.exe
$pText = _WinAPI_CreateString('MyDesktop')
$tProcess = DllStructCreate($tagPROCESS_INFORMATION)
$tStartup = DllStructCreate($tagSTARTUPINFO)
DllStructSetData($tStartup, 'Size', DllStructGetSize($tStartup))
DllStructSetData($tStartup, 'Desktop', $pText)
_WinAPI_CreateProcess('', @SystemDir & '\calc.exe', 0, 0, 0, $CREATE_NEW_PROCESS_GROUP, 0, 0, DllStructGetPtr($tStartup), DllStructGetPtr($tProcess))
EndIf
_WinAPI_SwitchDesktop($hDesk)
Sleep(10000) ; На 10 сек. включаем 2й рабочий стол
_WinAPI_CloseDesktop($hDesk) ; Закрываем 2й рабочий стол
_WinAPI_FreeMemory($pText)
$hDefault = _WinAPI_OpenDesktop('Default', $GENERIC_ALL, 0, True) ; Переключаемя на дефолтный рабочий стол
_WinAPI_SwitchDesktop($hDefault)
Func CreateDesktop($sName)
$tSECURITY_ATTRIBUTES = DllStructCreate('dword Length;ptr Descriptor;bool InheritHandle')
DllStructSetData($tSECURITY_ATTRIBUTES, 'Length', DllStructGetSize($tSECURITY_ATTRIBUTES))
DllStructSetData($tSECURITY_ATTRIBUTES, 'Descriptor', 0)
DllStructSetData($tSECURITY_ATTRIBUTES, 'InheritHandle', True)
$hDesktop = _WinAPI_CreateDesktop($sName, $GENERIC_ALL, 0, 0, $tSECURITY_ATTRIBUTES)
Return $hDesktop
EndFunc
Func CreateExplorer($sName)
$tProcess = DllStructCreate($tagPROCESS_INFORMATION)
$tStartup = DllStructCreate($tagSTARTUPINFO)
DllStructSetData($tStartup, 'Size', DllStructGetSize($tStartup))
DllStructSetData($tStartup, 'Desktop', _WinAPI_CreateString($sName))
_WinAPI_CreateProcess('', @WindowsDir & '\explorer.exe', 0, 0, 0, $CREATE_NEW_PROCESS_GROUP, 0, 0, DllStructGetPtr($tStartup), DllStructGetPtr($tProcess))
Return DllStructGetData($tProcess, 'ProcessID')
EndFunc