This test works for me (except position/size, read from registry for Notepad as I commented...) :
Dim pSec As SECURITY_ATTRIBUTES = New SECURITY_ATTRIBUTES()
Dim tSec As SECURITY_ATTRIBUTES = New SECURITY_ATTRIBUTES()
pSec.nLength = Marshal.SizeOf(pSec)
tSec.nLength = Marshal.SizeOf(tSec)
'Dim sApplicationName = "C:\WINDOWS\system32\notepad.exe"
Dim sApplicationName = Nothing
Dim sCommandLine = "notepad.exe"
Dim nCreationFlags = NORMAL_PRIORITY_CLASS
Dim sInfo As STARTUPINFO = New STARTUPINFO()
sInfo.cb = Marshal.SizeOf(sInfo)
sInfo.dwFlags = STARTF_USEPOSITION Or STARTF_USESIZE Or STARTF_USESHOWWINDOW
sInfo.wShowWindow = SW_SHOWNORMAL
' Ignored : read from HKEY_CURRENT_USER\SOFTWARE\Microsoft\Notepad
sInfo.dwX = 10
sInfo.dwY = 10
sInfo.dwXSize = 100
sInfo.dwYSize = 400
Dim pInfo As PROCESS_INFORMATION = New PROCESS_INFORMATION()
Dim bRet = CreateProcess(sApplicationName, sCommandLine, pSec, tSec, False, nCreationFlags, IntPtr.Zero, Nothing, sInfo, pInfo)
If (Not bRet) Then
Dim nErr = Marshal.GetLastWin32Error()
' ...
End If
With :
<DllImport("Kernel32.dll", CharSet:=CharSet.Unicode, SetLastError:=True)>
Public Shared Function CreateProcess(lpApplicationName As String, lpCommandLine As String, ByRef lpProcessAttributes As SECURITY_ATTRIBUTES,
ByRef lpThreadAttributes As SECURITY_ATTRIBUTES, bInheritHandles As Boolean, dwCreationFlags As UInteger,
lpEnvironment As IntPtr, lpCurrentDirectory As String,
<[In]> ByRef lpStartupInfo As STARTUPINFO, <Out> ByRef lpProcessInformation As PROCESS_INFORMATION) As Boolean
End Function
<StructLayout(LayoutKind.Sequential)>
Public Structure SECURITY_ATTRIBUTES
Public nLength As Integer
Public lpSecurityDescriptor As IntPtr
Public bInheritHandle As Integer
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure STARTUPINFO
Public cb As Integer
Public lpReserved As String
Public lpDesktop As String
Public lpTitle As String
Public dwX As Integer
Public dwY As Integer
Public dwXSize As Integer
Public dwYSize As Integer
Public dwXCountChars As Integer
Public dwYCountChars As Integer
Public dwFillAttribute As Integer
Public dwFlags As Integer
Public wShowWindow As Short
Public cbReserved2 As Short
Public lpReserved2 As IntPtr
Public hStdInput As IntPtr
Public hStdOutput As IntPtr
Public hStdError As IntPtr
End Structure
<StructLayout(LayoutKind.Sequential)>
Public Structure PROCESS_INFORMATION
Public hProcess As IntPtr
Public hThread As IntPtr
Public dwProcessId As Integer
Public dwThreadId As Integer
End Structure
Public Const NORMAL_PRIORITY_CLASS = &H20
Public Const STARTF_USESHOWWINDOW = &H1
Public Const STARTF_USESIZE = &H2
Public Const STARTF_USEPOSITION = &H4
Public Const STARTF_USECOUNTCHARS = &H8
Public Const STARTF_USEFILLATTRIBUTE = &H10
Public Const STARTF_RUNFULLSCREEN = &H20 ' ignored for non-x86 platforms
Public Const STARTF_FORCEONFEEDBACK = &H40
Public Const STARTF_FORCEOFFFEEDBACK = &H80
Public Const STARTF_USESTDHANDLES = &H100
Public Const STARTF_USEHOTKEY = &H200
Public Const STARTF_TITLEISLINKNAME = &H800
Public Const STARTF_TITLEISAPPID = &H1000
Public Const STARTF_PREVENTPINNING = &H2000
Public Const STARTF_UNTRUSTEDSOURCE = &H8000
Public Const SW_SHOWNORMAL = 1