[Process] Ustawienie AlwayOnTop dla uruchamianego procesu

0

Witam!

Piszę aplikację, która uruchamia inny program poleceniem:
< code = java >
Runtime.getRuntime().exec(path);

Jednak czasami uruchomienie drugiego programu trwa na tyle długo, że użytkownik zdąży jeszcze kliknąć w okno głównej aplikacji, przez co zasłoni uruchamiany proces.

Nie znalazłem możliwości ustawienia w procesie alwaysOnTop (można w ogóle takie coś zrobić?), dlatego moje pytanie brzmi: jak uzyskać taki efekt na uruchamianym procesie?

Próbowałem wywoływać toBack() zaraz po uruchomieniu procesu, ale jeżeli w systemie mamy uruchomioną trzecią aplikację, to po zakończeniu procesu potomnego, nie wrócę do okna mojej aplikacji tylko do tej trzeciej.

Dodam, że aplikacja nie musi być cross-platformowa i jest uruchamiana tylko pod windowsem.
0

Nie znalazłem możliwości ustawienia w procesie alwaysOnTop (można w ogóle takie coś zrobić?), dlatego moje pytanie brzmi: jak uzyskać taki efekt na uruchamianym procesie?

Nie uzyskasz tego w ten sposób. Spod standardowej przenośnej Javy nie zrobisz tego.
Po pierwsze procesy nie mają nic wspólnego (albo bardzo niewiele) z podsystemem okien w systemie operacyjnym. Tak więc nawet na logikę nie tam należy szukać.
Po drugie program okienkowy w takim Swingu (w SWT podobnie) ma pełną kontrolę jedynie nad oknami utworzonymi przez siebie, w ograniczonym stopniu nad oknami kontrolowanymi pośrednio przez JVM, a nad oknami spoza JVM kompletnie żadnej. Przełączanie okien w wyniku ich otwierania i zamykania jest kontrolowane przez system operacyjny i przez natywne programy w Windows.

Jeżeli chcesz taką kontrolę uzyskać spod Javy, to jedyną pewną metodą jest użycie JNI lub JNA (dostęp przez kod rodzimy w C/C++). Prawdopodobnie istnieją klasy lub metody Suna, które mogą "mieszać" za pomocą Javy w systemie Windows tak jak może to zrobić każdy program w tym systemie (JavaSE jest rodzimym programem w Windows, tak jak każdy inny napisany w C++), ale kod ten jest zapewne schowany lub nie jest łatwo dostępny ponieważ kontroluje on wszystkie okna wszystkich programów w Javie. Być może kiedyś to się zmieni, ale na razie to tylko zgadywanie.

Co do rozwiązania Twojego problemu - jest prostsze wyjście. Tuż przed zainicjowaniem nowego procesu Twoja aplikacja musi się zablokować przeciwko jakimkolwiek działaniom użytkownika. Jeden sposób to wyrzucenie modalnego dialogu informującego u uruchamianiu innego procesu (aż do jego pełnego uruchomienia, albo nawet aż do jego zakończenia), drugi, to schowanie okna aplikacji przez setVisible(false) lub coś podobnego, trzeci i najgorszy to zminimalizowanie okna aplikacji.

Innym problemem będzie wykrywanie zakończenia procesu, który odpaliłeś. Ale to inny temat.

0

Dzięki za odpowiedź.

Wykrywanie zakończenia procesu zrobiłem (bo potrzebowałem do innej funkcjonalności), więc to nie problem.

Olamagato napisał(a)

Co do rozwiązania Twojego problemu - jest prostsze wyjście. Tuż przed zainicjowaniem nowego procesu Twoja aplikacja musi się zablokować przeciwko jakimkolwiek działaniom użytkownika.

W czasie pracy procesu wyświetlam dodatkowo JFrame, czy mogę mu jakoś przekazać kontrolę? Inaczej: czy JFrame może blokować aplikację tak jak JDialog, ale nadal wyświetlając się jako osobne okno, a nie wew. okna głównego.

0

Okno może mieć status modalny mimo, że będzie oknem top-level. W każdym razie jest to możliwe w C++. W Javie (w tej chwili) nie jestem tego na 100% pewien, ale sądzę, że powinna być taka funkcjonalność bo kilka takich programów w Javie widziałem. Trzeba trochę poszperać w dokumentacji.

0

Dzięki :)
Problem rozwiązany

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