我为我的安装项目创建了一个自定义操作,并成功实现了一个表单,该表单显示了我的安装中的下载步骤的进度条(我在自定义操作代码中使用了WebClient)。所以我有两个相互关联的问题。
有没有办法在主设置窗口中显示下载进度条,而不是像我一样创建一个单独的表单?我更喜欢这个。
如果没有,那么当我调用form.ShowDialog()时,我该怎么做才能让我的表单显示在实际设置窗口的前面?我也在它上面调用了BringToFront(),它也不起作用。它就在那里,但它总是在主设置窗口后面。似乎必须有某种方法来获得正确的z顺序。
感谢您的帮助。
答案 0 :(得分:0)
所以我放弃了将进度条集成到实际安装程序屏幕的想法,但是让Windows窗体显示在顶部是一件非常荒谬的事情。我必须得到安装程序窗口的句柄并将其发送到后台,因为将进度条窗口向前移动将无法正常工作。我现在已经转向Mac开发了,所以回到这里只是令人沮丧。我记得我认为C#.NET很酷。它在Cocoa / Objective-C上没什么用。
令人愤怒的是一个名为BringToFront()的方法只是忽略了你。为什么我必须下载到Windows API代码来执行GUI的基本操作来管理Z-Order? Z顺序?严重?
如果你想知道,这就是我最终做的事情(通过谷歌):
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern bool SetWindowPos(
IntPtr hWnd, // window handle
IntPtr hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
uint uFlags); // window positioning flags
public const uint SWP_NOSIZE = 0x1;
public const uint SWP_NOMOVE = 0x2;
public const uint SWP_SHOWWINDOW = 0x40;
public const uint SWP_NOACTIVATE = 0x10;
[DllImport("user32.dll", EntryPoint = "GetWindow")]
public static extern IntPtr GetWindow(
IntPtr hWnd,
uint wCmd);
public const uint GW_HWNDFIRST = 0;
public const uint GW_HWNDLAST = 1;
public const uint GW_HWNDNEXT = 2;
public const uint GW_HWNDPREV = 3;
public static void ControlSendToBack(IntPtr control)
{
bool s = SetWindowPos(
control,
GetWindow(control, GW_HWNDLAST),
0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
}
我获得了安装程序窗口的句柄,然后在其上调用ControlSendToBack()。它有效,但它将它发送到最后。我尝试了另一种方法,只是将它发回一个位置,但这也不起作用。 Windows编程 - 和1995年一样好。很酷。
答案 1 :(得分:0)
另一种方法是使用BackgroundWorker。您让后台工作程序处理文件的下载,这样就不会阻止UI更新。