Główne okno programu jako okno potomne okna innego procesu

0

Witam. Piszę obecnie pewien program w C# (Visual C# 2005, .NET Framework 2.0) i potrzebuję zrobić coś takiego, żeby główne okno tego programu było oknem podrzędnym innego, już otwartego okna w systemie.

Przypuszczam że musi istnieć jakiś sposób zrobienia tego, ale w środowisku .NET jestem raczej świeży. Orientuję się za to trochę lepiej w WinAPI i w 'czystym' C++ udało mi się osiągnąć zamierzony efekt w następujący sposób:

    HWND rodzic = FindWindow(0, "Menedżer zadań Windows");
    if (!rodzic) MessageBox(0,"Nie znaleziono okna Menedżera",0,0);

    hwnd = CreateWindowEx (
           0,
           szClassName,
           "WindowsApp",
           WS_VISIBLE | WS_OVERLAPPEDWINDOW,
           10,
           10,
           400,
           320,
           rodzic,    // Jako okno-rodzic podaję wcześniej uzyskany uchwyt (lub 0 w przypadku błędu)
           NULL,
           NULL,
           NULL
    );

Znajdujemy HWND danego okna (dla testu podłączam się do Menedżera zadań) i podajemy ten uchwyt jako okno-rodzic przy wywołaniu CreateWindowEx, proste. No tylko że w C# nie ma ani CreateWindowEx, ani HWND, więc trzeba to jakoś obejść.

Czy ktoś może wie jak to uczynić w C#? Najlepiej żeby dało się to zrobić za pomocą metod .NET, ale rozwiązaniem w WinAPI też nie pogardzę :) Znalazłem jedną funkcję WinAPI: SetParent, tylko że ona z tego mojego okna robi kontrolkę i umieszcza ją wewnątrz nowego rodzica, a trochę nie o to mi chodzi.. :/

Z góry dzięki za wszelką pomoc!

0

Powiedziałbym, że SetParent da taki sam efekt. Napisałeś czego nie chcesz uzyskać, ale zapomniałeś dodać co tak naprawdę chcesz zrobić.

0

W zasadzie, przede wszystkim to chodzi o to że okno mojego programu ma być zawsze widoczne na pierwszym planie. Problem jest taki, że oprócz mojego programu w systemie działa jeszcze inny, w trybie jakby "pełnoekranowym", przez co nawet jak dam mojemu oknu styl "TopMost" to nic to nie daje. Dlatego pomyślałem że może rozwiązałoby sprawę utworzenia tego mojego okna jako potomne, tak żeby ten pełnoekranowy program traktował je jako własne niemodalne okno dialogowe.

Mam nadzieję że teraz bardziej zrozumiale to opisałem..

0

Co to za program, który działa w trybie jakby "pełnoekranowym"?

0

a czym to co opisałeś się różni od „z tego mojego okna robi kontrolkę i umieszcza ją wewnątrz nowego rodzica”?

0
Rev napisał(a)

Co to za program, który działa w trybie jakby "pełnoekranowym"?

Niestety nie pamiętam dokładnie nazwy, nie mam obecnie dostępu do komputera, na którym on się znajduje. Jest to aplikacja, która na czas działania zakrywa pasek zadań Windows i nie posiada paska tytułowego. Być może posiada styl TopMost. Jak tylko będę mieć możliwość to postaram się to dokładnie sprawdzić.

Co do różnicy - w załączonym pliku pierwszy.png widać efekt działania kodu z mojego pierwszego posta (dodam, że Menedżer zadań ma tutaj włączoną opcję "Zawsze na wierzchu", zaś ten program Windows App - nie). Takie wyjście by mnie najbardziej urządzało, gdyby było to możliwe w C#. W drugim pliku jak sama nazwa wskazuje - efekt działania SetParent. Od biedy mogłoby i tak być, gdyby nie to że jest jakiś dziwny problem z odświeżaniem zawartości okna (widoczne na screenie), zaś po wywołaniu tej funkcji w C# Menedżer zadań przestaje odpowiadać.

Teraz próbuję coś robić z funkcją SetWindowPos - wywołuję ją w timerze co sekundę, podając w drugim parametrze HWND_TOPMOST, dzięki czemu jeśli moje okno zostanie przesłonięte innym oknem z właściwością TopMost, to i tak wyjdzie na wierzch i będzie widoczne. Mimo to wolałbym inne rozwiązanie, bez WinAPI oraz timerów, więc jestem otwarty na propozycje :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1