Я очистил свой проект и решил свою проблему таким образом.
Меню> Проект> Очистить ...
Имеется перегрузка Form.ShowDialog (), которая принимает объект IWin32Window. Это IWin32Window рассматривается как родительское окно для формы.
Если у вас есть родительское окно как System.Windows.Forms.Form, просто передайте его. Если нет, получите HWND (возможно, P / Invoking to FindWindow ()) и создайте фиктивную реализацию IWin32Window, которая просто возвращает HWND ( Подробнее ).
Application.Run
. Тогда почему вы не хотите использовать Application.Run
? BringToFront ()
из OnLoad
или OnShown
? Похоже, что это поведение специфично для XP ... Следовательно, я не могу воспроизвести его в Vista.
http://www.gamedev.net/community/forums/ topic.asp? topic_id = 218484
РЕДАКТИРОВАТЬ: PS: Мне уже пора спать (2 часа ночи; -).
Спасибо всем за ваши ответы ... есть "несколько вещей", которые я могу попробовать .. Я могу даже пойти завтра в офис попробовать их ... Да, да ... Однажды у меня была жизнь, но я променял ее на стрижку и работу; -)
Всем привет. Кейт.
Я взломал это из приложения, над которым я работал. У нас есть большое приложение, которое загружает ряд модулей, написанных разными командами. Мы написали один из этих модулей, и нам нужно было, чтобы во время инициализации открывался диалог входа. Было установлено значение '.TopMost=true', но это не сработало.
Он использует WindowsFormsSynchronizationContext для открытия диалогового окна, а затем получает результат диалога обратно.
Я редко занимаюсь кодированием GUI, и подозреваю, что это может быть излишеством, но это может помочь кому-то, если он застрянет. У меня были проблемы с пониманием того, как состояние передается в SendOrPostCallback, поскольку все примеры, которые я смог найти, не использовали его.
Также это взято из рабочего приложения, но я удалил несколько битов кода и изменил некоторые детали. Приношу извинения, если оно не компилируется.
public bool Dummy()
{
// create the login dialog
DummyDialogForm myDialog = new DummyDialogForm();
// How we show it depends on where we are. We might be in the main thread, or in a background thread
// (There may be better ways of doing this??)
if (SynchronizationContext.Current == null)
{
// We are in the main thread. Just display the dialog
DialogResult result = myDialog.ShowDialog();
return result == DialogResult.OK;
}
else
{
// Get the window handle of the main window of the calling process
IntPtr windowHandle = Process.GetCurrentProcess().MainWindowHandle;
if (windowHandle == IntPtr.Zero)
{
// No window displayed yet
DialogResult result = myDialog.ShowDialog();
return result == DialogResult.OK;
}
else
{
// Parent window exists on separate thread
// We want the dialog box to appear in front of the main window in the calling program
// We would like to be able to do 'myDialog.ShowDialog(windowHandleWrapper)', but that means doing something on the UI thread
object resultState = null;
WindowsFormsSynchronizationContext.Current.Send(
new SendOrPostCallback(delegate(object state) { resultState = myDialog.ShowDialog(); }), resultState);
if (resultState is DialogResult)
{
DialogResult result = (DialogResult) resultState;
return result == DialogResult.OK;
}
else
return false;
}
}
}