Вам придется использовать класс маршала, чтобы упорядочить структуру до указателя.Пример:
$StructPointerSize = [System.Runtime.InteropServices.Marshal]::SizeOf($CDS)
$StructPointer = [System.Runtime.InteropServices.Marshal]::AllocHGlobal($StructPointerSize)
[System.Runtime.InteropServices.Marshal]::StructureToPtr($CDS,$StructPointer,$true
Это назначит некоторую память, а затем скопирует структуру в этот блок памяти.После этого указатель на вашу структуру будет находиться в переменной $ StructPointer.
Полный пример, который возобновляет приостановленное видео (используя отражение для создания типов):
$Domain = [System.AppDomain]::CurrentDomain
$AssemblyName = [System.Reflection.AssemblyName]::new('Messages')
$Assembly = $Domain.DefineDynamicAssembly($AssemblyName,'Run')
$ModuleBuilder = $Assembly.DefineDynamicModule('Messages')
# Define the struct (source : https://msdn.microsoft.com/en-us/library/windows/desktop/ms649010(v=vs.85).aspx)
$StructAttributes = 'AutoLayout, AnsiClass, Class, Public, SequentialLayout, BeforeFieldInit'
$COPYDATASTRUCT = $ModuleBuilder.DefineType('COPYDATASTRUCT',$StructAttributes)
$COPYDATASTRUCT.DefineField('dwData',[int],'Public')
$COPYDATASTRUCT.DefineField('cbData',[Uint32],'Public')
$COPYDATASTRUCT.DefineField('lpData',[System.IntPtr],'Public')
$COPYDATASTRUCT.CreateType()
# Define the class that will hold the PInvoke method
$MessageClass = $ModuleBuilder.DefineType('Messages','Public')
# Define the PInvoke Method
$SendMessage = $MessageClass.DefinePInvokeMethod(
'SendMessageW',
'User32.dll',
@('Public','Static','PinvokeImpl'),
[System.Reflection.CallingConventions]::Standard,
[System.IntPtr],
@([System.IntPtr],[Uint32],[System.IntPtr],[System.IntPtr]),
[System.Runtime.InteropServices.CallingConvention]::Winapi,
[System.Runtime.InteropServices.CharSet]::Unicode
)
$SendMessage.DefineParameter(1,'In','hWnd')
$SendMessage.DefineParameter(2,'In','Msg')
$SendMessage.DefineParameter(3,'In','wParam')
$SendMessage.DefineParameter(4,'In','lParam')
$SendMessage.SetImplementationFlags($SendMessage.GetMethodImplementationFlags() -bor [System.Reflection.MethodImplAttributes]::PreserveSig)
$MessageClass.CreateType()
$WM_COPYDATA = 0x004A;
$CMD_PLAY = 0xA0000004
$CurrentHandle = [System.Diagnostics.Process]::GetCurrentProcess().MainWindowHandle
$Arguments = '/Slave' + " " + $CurrentHandle.ToString()
Start-Process -FilePath 'C:\Program Files\MPC-HC\mpc-hc64.exe' -ArgumentList $Arguments
$CDS = [COPYDATASTRUCT]::new()
$CDS.dwData = $CMD_PLAY
$CDS.lpData = [System.IntPtr]::Zero
$CDS.cbData = 0
$StructPointerSize = [System.Runtime.InteropServices.Marshal]::SizeOf($CDS)
$StructPointer = [System.Runtime.InteropServices.Marshal]::AllocHGlobal($StructPointerSize)
[System.Runtime.InteropServices.Marshal]::StructureToPtr($CDS,$StructPointer,$true)
$p = (Get-Process mpc-hc64).MainWindowHandle
[messages]::SendMessageW($p,$WM_COPYDATA,0,$StructPointer)