public void Destroy() { Debug.WriteLine("Asking Unity to exit..."); PostMessage(unityHWND, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); job.Dispose(); job = null; process.Dispose(); process = null; unityHWND = IntPtr.Zero; }
protected override HandleRef BuildWindowCore(HandleRef hwndParent) { Debug.WriteLine("Going to launch Unity at: " + this.programName + " " + this.arguments); process = new Process(); process.StartInfo.FileName = programName; process.StartInfo.Arguments = arguments + (arguments.Length == 0 ? "" : " ") + "-parentHWND " + hwndParent.Handle; process.StartInfo.UseShellExecute = true; process.StartInfo.CreateNoWindow = true; process.Start(); process.WaitForInputIdle(); job = JobObject.CreateAsKillOnJobClose(); job.AssignProcess(process); int repeat = 50; while (unityHWND == IntPtr.Zero && repeat-- > 0) { Thread.Sleep(100); EnumChildWindows(hwndParent.Handle, WindowEnum, IntPtr.Zero); } if (unityHWND == IntPtr.Zero) { throw new Exception("Unable to find Unity window"); } Debug.WriteLine("Found Unity window: " + unityHWND); repeat += 150; while ((GetWindowLong(unityHWND, GWLP_USERDATA).ToInt32() & 1) == 0 && --repeat > 0) { Thread.Sleep(100); Debug.WriteLine("Waiting for Unity to initialize... " + repeat); } if (repeat == 0) { Debug.WriteLine("Timed out while waiting for Unity to initialize"); } else { Debug.WriteLine("Unity initialized!"); } ActivateUnityWindow(); return(new HandleRef(this, unityHWND)); }
public static JobObject CreateAsKillOnJobClose() { var job = new JobObject(); var jobInfo = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION() { BasicLimitInformation = new JOBOBJECT_BASIC_LIMIT_INFORMATION() { LimitFlags = JobObjectLimit.KillOnJobClose }, }; var size = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION)); if (!Native.SetInformationJobObject(job.SafeHandle, JobObjectInfoClass.ExtendedLimitInformation, ref jobInfo, size)) { throw new Win32Exception(); } return(job); }