Что нового

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

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
408
Строго не судите, 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:
 
Верх