我用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)
}