所以我放弃了将进度条集成到实际安装程序屏幕的想法,但是让 Windows 窗体显示在顶部是非常荒谬的。我必须获得安装程序窗口的句柄并将其发送到后台,因为将进度条窗口向前移动根本行不通。我现在已经转向 Mac 开发,所以回到这只是令人沮丧。我记得我认为 C# .NET 非常酷。它在 Cocoa/Objective-C 上什么都没有。
有一个名为 BringToFront() 的方法会直接忽略你,这真让人生气。为什么我必须下拉到 Windows API 代码来做一些像管理 Z-Order 这样的 GUI 基础工作?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 年一样好。酷。