Что нового

Создаём 2й рабочий стол.

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
 

YOgen

Знающий
Сообщения
58
Репутация
5
А можно было бы сделать что-то вроде UDF?

Хватило бы следующих функций (для начала ;D):
_Создать_РабСтол (Показать/Скрыть)
_Запустить_Приложение
_Закрыть_РабСтол
 

_Lexa98_

Осваивающий
Сообщения
551
Репутация
25
Viktor1703
Когда закрывается рабочий стол нужно добавить закрытие explorer.exe и calc.exe :smile:
 
Верх