Мое приложение - исполняемый файл vb6, но некоторые более новые формы в системе написаны на C #. Я хотел бы иметь возможность установить свойство Owner формы C # с помощью дескриптора главного окна приложения, чтобы диалоговые окна оставались сверху при переходе между моим приложением и другими приложениями.
Я могу получить hwnd главного окна приложения. Я не уверен, что я могу сделать оттуда?
ОБНОВЛЕНИЕ 20 октября 2008 года в 17: 06:
Скотт,
Спасибо за ответ. Я упустил из виду, что параметр метода Show / ShowDialog не был типа Form - я смотрел только на свойство Owner.
Я немного изменил код, который я использую из вышеприведенного - у нас есть компонент, который в общем случае загружает наши формы и вызывает ShowDialog. Мой код выглядит так:
Form launchTarget = FormFactory.GetForm(xxx); // psuedo-code for generic form loader
launchTarget.StartPosition = FormStartPosition.CenterParent;
IWin32Window parentWindow = GetWindowFromHwnd(hwnd);
launchTarget.ShowDialog(parentWindow);
GetWindowFromHwnd
- это версия вашего кода в методе:
private IWin32Window GetWindowFromHost(int hwnd)
{
IWin32Window window = null;
IntPtr handle = new IntPtr(hwnd);
try
{
NativeWindow nativeWindow = new NativeWindow();
nativeWindow.AssignHandle(handle);
window = nativeWindow;
}
finally
{
handle = IntPtr.Zero;
}
return window;
}
К сожалению, это не делает то, на что я надеялся. Форма отображается модально, но она не отображается в правильном положении и не остается наверху, когда я перемещаюсь назад и возвращаюсь в родительское окно. Наши модалы не показывают задачу на панели задач, поэтому окно, по-видимому, «исчезает» (хотя оно все еще присутствует в списке окон alt-tab). Это для меня означает, что я не могу иметь право hwnd. Если у вас есть другие предложения, пожалуйста, ответьте. Еще раз спасибо.
ОБНОВЛЕНИЕ 10 ноября 2008 г. в 16: 25
Одно последующее замечание - если вы включите его в вызов метода в try / finally, как во втором посте Скотта, вызов в блоке finally должен быть:
parentWindow.ReleaseHandle();