Ejemplo n.º 1
0
        /// <summary>
        /// Account Picker APIs do not work well with console apps because the console
        /// window belongs to a different process, which causes a security exception.
        /// In general, if the parent window handle does not belong to the current process,
        /// we need to take control over the window handle by injecting a splash screen.
        /// </summary>
        private bool UseSplashScreen()
        {
            WindowsNativeMethods.GetWindowThreadProcessId(_parentHandle, out uint windowProcessId);
            uint appProcessId = WindowsNativeMethods.GetCurrentProcessId();

            return(appProcessId != windowProcessId);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Account Picker APIs do not work well with console apps because the console
        /// window belongs to a different process, which causes a security exception.
        /// In general, if the parent window handle does not belong to the current process,
        /// we need to take control over the window handle by injecting a splash screen.
        /// </summary>
        private bool UseSplashScreen()
        {
            if (_synchronizationContext == null)
            {
                return(true);
            }

            WindowsNativeMethods.GetWindowThreadProcessId(_parentHandle, out uint windowProcessId);
            uint appProcessId = WindowsNativeMethods.GetCurrentProcessId();

            return(appProcessId != windowProcessId);
        }
Ejemplo n.º 3
0
 private static void SendStopMessageToProcess(int pid)
 {
     for (var ptr = WindowsNativeMethods.GetTopWindow(IntPtr.Zero); ptr != IntPtr.Zero; ptr = WindowsNativeMethods.GetWindow(ptr, 2))
     {
         uint num;
         WindowsNativeMethods.GetWindowThreadProcessId(ptr, out num);
         if (pid == num)
         {
             var hWnd = new HandleRef(null, ptr);
             WindowsNativeMethods.PostMessage(hWnd, 0x12, IntPtr.Zero, IntPtr.Zero);
             return;
         }
     }
 }
 private void SendStopMessageToProcess(int pid)
 {
     Logger.LogInformation($"Sending shutdown request to {pid}");
     for (var ptr = WindowsNativeMethods.GetTopWindow(IntPtr.Zero); ptr != IntPtr.Zero; ptr = WindowsNativeMethods.GetWindow(ptr, 2))
     {
         WindowsNativeMethods.GetWindowThreadProcessId(ptr, out var windowProcessId);
         if (pid == windowProcessId)
         {
             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()}");
             }
             return;
         }
     }
     throw new InvalidOperationException($"Unable to find main window for process {pid}");
 }
Ejemplo n.º 5
0
        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}");
            }
        }
Ejemplo n.º 6
0
        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}");
            }
        }