Поэтому я отказался от идеи интегрирования индикатора выполнения в экран самого установщика, но просто смешно, что нужно, чтобы форма Windows отображалась сверху. Я должен получить дескриптор в окне установщика и отправить его в фоновом режиме, потому что продвижение окна индикатора выполнения просто не будет работать. Я перешел к разработке Mac сейчас, поэтому возвращаться к этому просто разочаровывает. Я помню, как думал, что C # .NET был довольно крутым. Это не имеет НИЧЕГО на Какао / Objective-C.
Это бесит, когда есть метод с именем BringToFront (), который просто игнорирует вас. Почему мне нужно перейти к коду Windows API, чтобы сделать что-то такое же фундаментальное для графического интерфейса, как управление Z-Order? Z-Order? Серьезно?
Если вам интересно, вот что я в итоге сделал (через Google):
[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 году. Круто.