Czy mogę uzyskać zachowanie ustawienia właściciela formularza WinForm za pomocą hwnd / NativeWindow?
Moja aplikacja to plik wykonywalny vb6, ale niektóre nowsze formy w systemie są napisane w języku C #. Chciałbym móc ustawić własność właściciela formularza C # za pomocą uchwytu głównego okna aplikacji, aby okna dialogowe pozostawały na górze podczas przechodzenia w tę iz powrotem między moją aplikacją a innymi aplikacjami.
Mogę pobrać hwnd głównego okna aplikacji. Nie jestem pewien, co mogę tam zrobić?
UPDATE Październik 20 '08 o 17:06:
Scott,
Dzięki za odpowiedzi. Przeoczyłem, że parametr metody Show / ShowDialog nie był typu Form - patrzyłem tylko na właściwość Owner.
Lekko zmodyfikowałem kod, którego używam z powyższego - mamy komponent, który ładuje nasze formularze i wywołuje ShowDialog. Mój kod wygląda tak:
Form launchTarget = FormFactory.GetForm(xxx); // psuedo-code for generic form loader
launchTarget.StartPosition = FormStartPosition.CenterParent;
IWin32Window parentWindow = GetWindowFromHwnd(hwnd);
launchTarget.ShowDialog(parentWindow);
GetWindowFromHwnd
jest wersją twojego kodu owiniętą metodą:
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;
}
Niestety to nie robi tego, co miałem nadzieję. Formularz wyświetla się modalnie, ale nie pojawia się we właściwej pozycji, ani nie jest na górze, gdy odsuwam się i wracam do okna nadrzędnego. Nasze moduły nie wyświetlają zadania na pasku zadań, więc okno pozornie „znika” (chociaż nadal znajduje się na liście okien Alt-Tab). To dla mnie wskazuje, że mogę nie mieć odpowiedniego hwnda. Jeśli masz jakieś inne sugestie, odpowiedz ponownie. Dzięki jeszcze raz.
AKTUALIZACJA 10 listopada 2008 o 16:25
Jedna uwaga kontynuacji - jeśli uwzględnisz to w wywołaniu metody w try / wreszcie, tak jak w drugim poście Scotta, wywołanie w bloku finally powinno być:
parentWindow.ReleaseHandle();