using System;
using System.Runtime.InteropServices;
namespace Vanara.PInvoke
{
public static partial class Shell32
{
/// Flags that indicate the action to be taken by the ProgressDialog.SetTime() method.
[PInvokeData("Shlobj_core.h", MSDNShortId = "bb775248")]
public enum PDTIMER : uint
{
/// Resets the timer to zero. Progress will be calculated from the time this method is called.
PDTIMER_RESET = (0x01),
/// Progress has been suspended.
PDTIMER_PAUSE = (0x02),
/// Progress has been resumed.
PDTIMER_RESUME = (0x03)
}
/// Defines a mechanism for retrieving a service object; that is, an object that provides custom support to other objects.
/// Flags that control the operation of the progress dialog box.
[PInvokeData("Shlobj_core.h", MSDNShortId = "bb775248")]
[Flags]
public enum PROGDLG : uint
{
/// Normal progress dialog box behavior.
PROGDLG_NORMAL = 0x00000000,
///
/// The progress dialog box will be modal to the window specified by hwndParent. By default, a progress dialog box is modeless.
///
PROGDLG_MODAL = 0x00000001,
/// Automatically estimate the remaining time and display the estimate on line 3.
/// If this flag is set, IProgressDialog::SetLine can be used only to display text on lines 1 and 2.
PROGDLG_AUTOTIME = 0x00000002,
/// Do not show the "time remaining" text.
PROGDLG_NOTIME = 0x00000004,
/// Do not display a minimize button on the dialog box's caption bar.
PROGDLG_NOMINIMIZE = 0x00000008,
/// Do not display a progress bar.
///
/// Typically, an application can quantitatively determine how much of the operation remains and periodically pass that value to
/// IProgressDialog::SetProgress. The progress dialog box uses this information to update its progress bar. This flag is
/// typically set when the calling application must wait for an operation to finish, but does not have any quantitative
/// information it can use to update the dialog box.
///
PROGDLG_NOPROGRESSBAR = 0x00000010,
/// Sets the progress bar to marquee mode.
///
/// This causes the progress bar to scroll horizontally, similar to a marquee display. Use this when you wish to indicate that
/// progress is being made, but the time required for the operation is unknown.
///
PROGDLG_MARQUEEPROGRESS = 0x00000020,
/// Do not display a cancel button.
/// The operation cannot be canceled. Use this only when absolutely necessary.
PROGDLG_NOCANCEL = 0x00000040
}
///
/// Exposes methods that provide options for an application to display a progress dialog box. This interface is exported by the
/// progress dialog box object (CLSID_ProgressDialog). This object is a generic way to show a user how an operation is progressing.
/// It is typically used when deleting, uploading, copying, moving, or downloading large numbers of files.
///
// https://msdn.microsoft.com/en-us/library/windows/desktop/bb775248(v=vs.85).aspx
[PInvokeData("Shlobj_core.h", MSDNShortId = "bb775248")]
[ComImport, Guid("EBBC7C04-315E-11d2-B62F-006097DF5BD4"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), CoClass(typeof(ProgressDialog))]
public interface IProgressDialog
{
/// Starts the progress dialog box.
/// A handle to the dialog box's parent window.
/// Reserved. Set to null.
/// Flags that control the operation of the progress dialog box.
/// Reserved. Set to IntPtr.Zero
void StartProgressDialog(HWND hwndParent, [MarshalAs(UnmanagedType.IUnknown), Optional] object punkEnableModless, PROGDLG dwFlags, IntPtr pvResevered = default);
/// Stops the progress dialog box and removes it from the screen.
void StopProgressDialog();
/// Sets the title of the progress dialog box.
/// A pointer to a null-terminated Unicode string that contains the dialog box title.
void SetTitle([MarshalAs(UnmanagedType.LPWStr)] string pwzTitle);
///
/// Specifies an Audio-Video Interleaved (AVI) clip that runs in the dialog box. Note: Note This method is not supported in
/// Windows Vista or later versions.
///
/// An instance handle to the module from which the AVI resource should be loaded.
///
/// An AVI resource identifier. To create this value, use the MAKEINTRESOURCE macro. The control loads the AVI resource from the
/// module specified by hInstAnimation.
///
void SetAnimation(HINSTANCE hInstAnimation, ushort idAnimation);
/// Checks whether the user has canceled the operation.
/// TRUE if the user has canceled the operation; otherwise, FALSE.
///
/// The system does not send a message to the application when the user clicks the Cancel button. You must periodically use this
/// function to poll the progress dialog box object to determine whether the operation has been canceled.
///
[PreserveSig]
[return: MarshalAs(UnmanagedType.Bool)]
bool HasUserCancelled();
/// Updates the progress dialog box with the current state of the operation.
///
/// An application-defined value that indicates what proportion of the operation has been completed at the time the method was called.
///
///
/// An application-defined value that specifies what value dwCompleted will have when the operation is complete.
///
void SetProgress(uint dwCompleted, uint dwTotal);
/// Updates the progress dialog box with the current state of the operation.
///
/// An application-defined value that indicates what proportion of the operation has been completed at the time the method was called.
///
///
/// An application-defined value that specifies what value ullCompleted will have when the operation is complete.
///
void SetProgress64(ulong ullCompleted, ulong ullTotal);
/// Displays a message in the progress dialog.
///
/// The line number on which the text is to be displayed. Currently there are three lines—1, 2, and 3. If the PROGDLG_AUTOTIME
/// flag was included in the dwFlags parameter when IProgressDialog::StartProgressDialog was called, only lines 1 and 2 can be
/// used. The estimated time will be displayed on line 3.
///
/// A null-terminated Unicode string that contains the text.
///
/// TRUE to have path strings compacted if they are too large to fit on a line. The paths are compacted with PathCompactPath.
///
/// Reserved. Set to IntPtr.Zero.
///
/// This function is typically used to display a message such as "Item XXX is now being processed." typically, messages are
/// displayed on lines 1 and 2, with line 3 reserved for the estimated time.
///
void SetLine(uint dwLineNum, [MarshalAs(UnmanagedType.LPWStr)] string pwzString, [MarshalAs(UnmanagedType.VariantBool)] bool fCompactPath, IntPtr pvResevered = default);
/// Sets a message to be displayed if the user cancels the operation.
/// A pointer to a null-terminated Unicode string that contains the message to be displayed.
/// Reserved. Set to NULL.
///
/// Even though the user clicks Cancel, the application cannot immediately call IProgressDialog::StopProgressDialog to close the
/// dialog box. The application must wait until the next time it calls IProgressDialog::HasUserCancelled to discover that the
/// user has canceled the operation. Since this delay might be significant, the progress dialog box provides the user with
/// immediate feedback by clearing text lines 1 and 2 and displaying the cancel message on line 3. The message is intended to let
/// the user know that the delay is normal and that the progress dialog box will be closed shortly. It is typically is set to
/// something like "Please wait while ...".
///
void SetCancelMsg([MarshalAs(UnmanagedType.LPWStr)] string pwzCancelMsg, IntPtr pvResevered = default);
/// Resets the progress dialog box timer to zero.
/// Flags that indicate the action to be taken by the timer.
/// Reserved. Set to NULL.
///
/// The timer is used to estimate the remaining time. It is started when your application calls
/// IProgressDialog::StartProgressDialog. Unless your application will start immediately, it should call Timer just before
/// starting the operation. This practice ensures that the time estimates will be as accurate as possible. This method should not
/// be called after the first call to IProgressDialog::SetProgress.
///
void Timer(PDTIMER dwTimerAction, IntPtr pvResevered = default);
}
/// Class object for IProgressDialog (CLSID_ProgressDialog).
[ComImport, Guid("F8383852-FCD3-11d1-A6B9-006097DF5BD4"), ClassInterface(ClassInterfaceType.None)]
public class ProgressDialog
{
}
}
}