IProgressDialog 立即启动

Gáb*_*bor 5 c# winapi

我用IProgressDialog按照正常方式使用界面,一切正常,但进度对话框仅在几秒钟后出现,当它确定操作确实很长时。尽管这没有任何记录,但这似乎是有意的行为,并且在许多情况下还不错。但是,在这个特定的应用程序中,我需要立即显示它。

我在整个网络上找到了一个参考文献来承认这一点并提出解决方法。然而,也许是因为这九年里出现了相当多的新 Windows 版本,今天它似乎不起作用:

IProgressDialog dialog;
dialog.StartProgressDialog(owner, null, flags, IntPtr.Zero);
...
IntPtr DialogHWnd;
((IOleWindow)dialog).GetWindow(out DialogHWnd);
SendMessage(DialogHWnd, WM_TIMER, new IntPtr(1), IntPtr.Zero);
Run Code Online (Sandbox Code Playgroud)

窗口句柄没问题,我检查了一下,没有错误,只是行为没有变化。该对话框仅在几秒钟后出现。

有人有关于在 C# 中重新创建相同对话框和功能的建议吗?当然,并非不可能,但除了用户非常熟悉之外,库存对话框还具有动画和取消行为等不错的功能。

小智 5

立即在StartProgressDialogdialog.Timer(PDTIMER_RESUME, null)之前或之后调用。这是一个最小样本:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {

[Flags]
public enum IPD_Flags: uint {
    Normal = 0x00000000,
    Modal = 0x00000001,
    AutoTime = 0x00000002,
    NoTime = 0x00000004,
    NoMinimize = 0x00000008,
    NoProgressBar = 0x00000010 
}

[Flags]
public enum IPDTIMER_Flags: uint {
    Reset = 0x00000001,
    Pause = 0x00000002,
    Resume = 0x00000003
}

[ComImport]
[Guid("F8383852-FCD3-11d1-A6B9-006097DF5BD4")]
internal class ProgressDialog {
}

[ComImport]
[Guid("EBBC7C04-315E-11d2-B62F-006097DF5BD4")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IProgressDialog {

    [PreserveSig]
    void StartProgressDialog(IntPtr hwndParent
        , [MarshalAs(UnmanagedType.IUnknown)] object  punkEnableModless
        , uint dwFlags
        , IntPtr pvResevered);

    [PreserveSig]
    void StopProgressDialog();

    [PreserveSig]
    void SetTitle([MarshalAs(UnmanagedType.LPWStr)] string pwzTitle);

    [PreserveSig]
    void SetAnimation(IntPtr hInstAnimation, ushort idAnimation);

    [PreserveSig]
    [return: MarshalAs(UnmanagedType.Bool)]
    bool HasUserCancelled();

    [PreserveSig]
    void SetProgress(uint dwCompleted, uint dwTotal);

    [PreserveSig]
    void SetProgress64(ulong ullCompleted, ulong ullTotal );

    [PreserveSig]
    void SetLine(uint dwLineNum
        , [MarshalAs(UnmanagedType.LPWStr)] string pwzString
        , [MarshalAs(UnmanagedType.VariantBool)] bool fCompactPath
        , IntPtr pvResevered);

    [PreserveSig]
    void SetCancelMsg([MarshalAs(UnmanagedType.LPWStr)]string pwzCancelMsg, object pvResevered);

    [PreserveSig]
    void Timer(uint dwTimerAction, object pvResevered);

}


public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {
        ProgressDialog progressDialog = new ProgressDialog();
        IProgressDialog iProgressDialog = (IProgressDialog)progressDialog;

        iProgressDialog.Timer((uint) IPDTIMER_Flags.Resume, null);
        iProgressDialog.StartProgressDialog(this.Handle
            , null
            , (uint)(IPD_Flags.Normal | IPD_Flags.NoMinimize)
            , IntPtr.Zero);
    }
}
Run Code Online (Sandbox Code Playgroud)

}