Jump to content

Recommended Posts

Posted

Hello,

How do you do to run a process in a new desktop after switching in it ?

I try like this but that don't work (the process run always in the default desktop) :

$OriginalThread = DLLCall("kernel32.dll","int","GetCurrentThreadId")
$OriginalInput = DllCall('user32.dll', 'hwnd', 'OpenInputDesktop', 'int', 0, 'int', 0, 'int', 0x100)
$NouveauBureau = DLLCall("user32.dll","int","CreateDesktop","str","NouveauBureau", "str","","ptr",0,"int",0,"int",0x10000000,"ptr",0)
$Startup = DllStructCreate($tagSTARTUPINFO)
$Process = DllStructCreate($tagPROCESS_INFORMATION)
DllCall('user32.dll', 'int', 'SetThreadDesktop', 'hwnd', $NouveauBureau[0])
DLLCall("user32.dll","int","SwitchDesktop","int",$NouveauBureau[0]) 
DllStructSetData($Startup, "Size", DllStructGetSize($Startup))
DllStructSetData($Startup, "Desktop", DllStructGetData($Startup, "NouveauBureau"))
_API_CreateProcess("", "C:\Windows\Notepad.exe", 0, 0, False, 0, 0, "", DllStructGetPtr($Startup), DllStructGetPtr($Process))
Sleep(2000)
_API_CloseHandle(DllStructGetData($Process, "hProcess"))
_API_CloseHandle(DllStructGetData($Process, "hThread" ))
DLLCall("user32.dll","int","SwitchDesktop","int",$OriginalInput[0]) 
DllCall('user32.dll', 'int', 'SetThreadDesktop', 'hwnd', $OriginalThread[0])
DLLCall("user32.dll","int","CloseDesktop","int",$NouveauBureau[0])

Certainly i make a mistake but i can't fing where...

Thanks !

  • 2 months later...
Posted (edited)

If you look in my signature you will find the create process function.

inside the STARTUPINFO you can specify the name of the desktop you want your process to be run DO IT BEFORE YOU SWITCH

!Careful keep track of the PID otherwise you will never be able to close that desktop again.

Another thing pointer to NULL strings are different in AUTOIT from C and you cannot use just 0 so

$NouveauBureau = DLLCall("user32.dll","int","CreateDesktop","str","NouveauBureau", "str",Pt_emptyStr,"ptr",Pt_emptyStr,"int",0,"int",0x10000000,"ptr",Pt_emptyStr)
DllCall('user32.dll', 'int', 'SetThreadDesktop', 'hwnd', $NouveauBureau[0])
DLLCall("user32.dll","int","SwitchDesktop",'hwnd',$NouveauBureau[0])

Func Pt_emptyStr()
    $str=""
    $temp = DllStructCreate("char [" & Stringlen($str) + 1 & "]")
     DllStructSetData($temp,1, $str)
    $P_empty = DllStructGetPtr($temp)
    Return $P_empty
EndFunc

is the correct function

Edited by Hermano

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...