private void SendStopMessageToProcess(int pid) { Logger.LogInformation($"Sending shutdown request to {pid}"); var found = false; WindowsNativeMethods.EnumWindows((ptr, param) => { WindowsNativeMethods.GetWindowThreadProcessId(ptr, out var windowProcessId); if (pid == windowProcessId) { // 256 is the max length var className = new StringBuilder(256); if (WindowsNativeMethods.GetClassName(ptr, className, className.Capacity) == 0) { throw new InvalidOperationException($"Unable to get window class name: {Marshal.GetLastWin32Error()}"); } if (!string.Equals(className.ToString(), "IISEXPRESS", StringComparison.OrdinalIgnoreCase)) { // skip windows without IISEXPRESS class return(true); } var hWnd = new HandleRef(null, ptr); if (!WindowsNativeMethods.PostMessage(hWnd, 0x12, IntPtr.Zero, IntPtr.Zero)) { throw new InvalidOperationException($"Unable to PostMessage to process {pid}. LastError: {Marshal.GetLastWin32Error()}"); } found = true; return(false); } return(true); }, IntPtr.Zero); if (!found) { throw new InvalidOperationException($"Unable to find main window for process {pid}"); } }
private void SendStopMessageToProcess(int pid) { var found = false; var extraLogging = false; var retryCount = 5; while (!found && retryCount > 0) { Logger.LogInformation($"Sending shutdown request to {pid}"); WindowsNativeMethods.EnumWindows((ptr, param) => { WindowsNativeMethods.GetWindowThreadProcessId(ptr, out var windowProcessId); if (extraLogging) { Logger.LogDebug($"EnumWindow returned {ptr} belonging to {windowProcessId}"); } if (pid == windowProcessId) { // 256 is the max length var className = new StringBuilder(256); if (WindowsNativeMethods.GetClassName(ptr, className, className.Capacity) == 0) { throw new InvalidOperationException($"Unable to get window class name: {Marshal.GetLastWin32Error()}"); } if (!string.Equals(className.ToString(), "IISEXPRESS", StringComparison.OrdinalIgnoreCase)) { Logger.LogDebug($"Skipping window {ptr} with class name {className}"); // skip windows without IISEXPRESS class return(true); } var hWnd = new HandleRef(null, ptr); if (!WindowsNativeMethods.PostMessage(hWnd, 0x12, IntPtr.Zero, IntPtr.Zero)) { throw new InvalidOperationException($"Unable to PostMessage to process {pid}. LastError: {Marshal.GetLastWin32Error()}"); } found = true; return(false); } return(true); }, IntPtr.Zero); if (!found) { Thread.Sleep(100); } // Add extra logging if first try was unsuccessful extraLogging = true; retryCount--; } if (!found) { throw new InvalidOperationException($"Unable to find main window for process {pid}"); } }