/// <summary>Returns the info structure for dialog display settings.</summary>
 /// <param name="owner">The System.Windows.Forms.IWin32Window the dialog will display in front of.</param>
 private CREDUI.INFO GetInfo(IWin32Window owner)
 {
     CREDUI.INFO info = new CREDUI.INFO();
     if (owner != null)
     {
         info.hwndParent = owner.Handle;
     }
     info.pszCaptionText = this.Caption;
     info.pszMessageText = this.Message;
     if (this.Banner != null)
     {
         info.hbmBanner = new Bitmap(this.Banner, ValidBannerWidth, ValidBannerHeight).GetHbitmap();
     }
     info.cbSize = Marshal.SizeOf(info);
     return(info);
 }
        /// <summary>Returns a DialogResult indicating the user action.</summary>
        /// <param name="owner">The System.Windows.Forms.IWin32Window the dialog will display in front of.</param>
        /// <remarks>
        /// Sets the name, password and SaveChecked accessors to the state of the dialog as it was dismissed by the user.
        /// </remarks>
        private DialogResult ShowDialog(IWin32Window owner)
        {
            // set the api call parameters
            StringBuilder name = new StringBuilder(CREDUI.MAX_USERNAME_LENGTH);

            name.Append(this.Name);

            StringBuilder password = new StringBuilder(CREDUI.MAX_PASSWORD_LENGTH);

            password.Append(this.Password);

            int saveChecked = Convert.ToInt32(this.SaveChecked);

            CREDUI.INFO  info  = GetInfo(owner);
            CREDUI.FLAGS flags = GetFlags();

            // make the api call
            CREDUI.ReturnCodes code = CREDUI.PromptForCredentials(
                ref info,
                this.Target,
                IntPtr.Zero, 0,
                name, CREDUI.MAX_USERNAME_LENGTH,
                password, CREDUI.MAX_PASSWORD_LENGTH,
                ref saveChecked,
                flags
                );

            // clean up resources
            if (this.Banner != null)
            {
                GDI32.DeleteObject(info.hbmBanner);
            }

            // set the accessors from the api call parameters
            this.Name        = name.ToString();
            this.Password    = password.ToString();
            this.SaveChecked = Convert.ToBoolean(saveChecked);

            return(GetDialogResult(code));
        }