Windows ma funkcję zapobiegającą kradzieży ostrości; zamiast tego miga ikona na pasku zadań. W XP jest on domyślnie włączony (jedyne miejsce, w którym widziałem, aby go zmienić, używa TweakUI, ale gdzieś jest ustawienie rejestru). W systemie Vista mogli zmienić domyślne ustawienia i / lub ujawnić je jako ustawienie dostępne dla użytkownika za pomocą gotowego do użycia interfejsu użytkownika.
Zapobieganie przesuwaniu się okien do przodu i skupianiu się na nich jest funkcją od czasu Windows 2K (i jestem za to wdzięczny).
To powiedziawszy, mam małą aplikację Java, której używam, aby przypomnieć mi o rejestrowaniu moich działań podczas pracy i co 30 minut włącza się jako aktywne okno (oczywiście można je konfigurować). Zawsze działa konsekwentnie w systemie Windows XP i nigdy nie miga okno paska tytułu. Używa następującego kodu, wywoływanego w wątku interfejsu użytkownika w wyniku uruchomienia zdarzenia licznika czasu:
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();
(pierwsza linia przywraca, jeśli jest zminimalizowana ... w rzeczywistości przywracałaby ją, gdyby była zmaksymalizowana, ale nigdy jej tak nie było).
Chociaż zwykle mam zminimalizowaną aplikację, często jest ona po prostu za moim edytorem tekstu. I, jak powiedziałem, zawsze działa.
Mam pojęcie, jaki może być twój problem - być może masz stan wyścigu z wywołaniem setVisible (). toFront () może nie być poprawne, chyba że okno jest faktycznie wyświetlane po wywołaniu; Już wcześniej miałem ten problem z requestFocus (). Może być konieczne umieszczenie wywołania toFront () w nasłuchiwaniu interfejsu użytkownika w zdarzeniu aktywowanym przez okno.
07.09.2014: W pewnym momencie powyższy kod przestał działać, być może w Javie 6 lub 7. Po pewnych badaniach i eksperymentach musiałem zaktualizować kod, aby nadpisać toFront
metodę okna, zrób to (w połączeniu ze zmodyfikowanym kodem z tego, co jest ponad):
setVisible(true);
toFront();
requestFocus();
repaint();
...
public @Override void toFront() {
int sta = super.getExtendedState() & ~JFrame.ICONIFIED & JFrame.NORMAL;
super.setExtendedState(sta);
super.setAlwaysOnTop(true);
super.toFront();
super.requestFocus();
super.setAlwaysOnTop(false);
}
Od wersji Java 8_20 ten kod wydaje się działać poprawnie.