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([Optional] 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([Optional] 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 { } } }