private static DialogResult InternalShow(IWin32Window owner,
                                                 string text, string caption,
                                                 MessageBoxButtons buttons, 
                                                 MessageBoxIcon icon,
                                                 MessageBoxDefaultButton defaultButton, 
                                                 MessageBoxOptions options,
                                                 HelpInfo helpInfo)
        {
            // Check if trying to show a message box from a non-interactive process, this is not possible
            if (!SystemInformation.UserInteractive && ((options & (MessageBoxOptions.ServiceNotification | MessageBoxOptions.DefaultDesktopOnly)) == 0))
                throw new InvalidOperationException("Cannot show modal dialog when non-interactive");

            // Check if trying to show a message box from a service and the owner has been specified, this is not possible
            if ((owner != null) && ((options & (MessageBoxOptions.ServiceNotification | MessageBoxOptions.DefaultDesktopOnly)) != 0))
                throw new ArgumentException("Cannot show message box from a service with an owner specified", "options");

            // Check if trying to show a message box from a service and help information is specified, this is not possible
            if ((helpInfo != null) && ((options & (MessageBoxOptions.ServiceNotification | MessageBoxOptions.DefaultDesktopOnly)) != 0))
                throw new ArgumentException("Cannot show message box from a service with help specified", "options");

            // If help information provided or we are not a service/default desktop application then grab an owner for showing the message box
            IWin32Window showOwner = null;
            if ((helpInfo != null) || ((options & (MessageBoxOptions.ServiceNotification | MessageBoxOptions.DefaultDesktopOnly)) == 0))
            {
                // If do not have an owner passed in then get the active window and use that instead
                if (owner == null)
                    showOwner = Control.FromHandle(PI.GetActiveWindow());
                else
                    showOwner = owner;
            }

            // Show message box window as a modal dialog and then dispose of it afterwards
            using (KryptonMessageBox kmb = new KryptonMessageBox(text, caption, buttons, icon, defaultButton, options, helpInfo))
            {
                if (showOwner == null)
                    kmb.StartPosition = FormStartPosition.CenterScreen;
                else
                    kmb.StartPosition = FormStartPosition.CenterParent;

                return kmb.ShowDialog(showOwner);
            }
        }