/// <summary> /// Gets the window handle for the game view window. /// </summary> /// <param name="processId">The id of the process that owns the game view window.</param> /// <returns>Window handle if the window was found, IntPtr.Zero otherwise.</returns> internal static IntPtr GetGameViewWindowHandle(int processId) { const string GameViewCaption = "UnityEditor.GameView"; const string UnityContainerClassName = "UnityContainerWndClass"; var window = new IntPtr(); Win32Helpers.EnumWindows(delegate(IntPtr hWnd, IntPtr lParam) { if (!Win32Helpers.IsWindowVisible(hWnd)) { return(true); } var windowProcessId = 0; Win32Helpers.GetWindowThreadProcessId(hWnd, out windowProcessId); if (windowProcessId == processId) { StringBuilder builder = new StringBuilder(256); Win32Helpers.GetClassName(hWnd, builder, 256); if (builder.ToString() == UnityContainerClassName) { //Ok, we found one of our containers, let's try to find the game view handle among the children Win32Helpers.EnumChildWindows(hWnd, delegate(IntPtr childHwnd, IntPtr childParam) { if (!Win32Helpers.IsWindowVisible(childHwnd)) { return(true); } int childLength = Win32Helpers.GetWindowTextLength(childHwnd); if (childLength == 0) { return(true); } StringBuilder childBuilder = new StringBuilder(childLength); Win32Helpers.GetWindowText(childHwnd, childBuilder, childLength + 1); if (childBuilder.ToString() == GameViewCaption) { //Found it! window = childHwnd; return(false); } return(true); }, IntPtr.Zero); } } return(true); }, IntPtr.Zero); return(window); }