Windows có khả năng ngăn chặn các cửa sổ lấy cắp tiêu điểm; thay vào đó nó sẽ nhấp nháy biểu tượng thanh tác vụ. Trong XP, nó được bật theo mặc định (nơi duy nhất tôi đã thấy để thay đổi nó là sử dụng TweakUI, nhưng có một cài đặt đăng ký ở đâu đó). Trong Vista, họ có thể đã thay đổi mặc định và / hoặc hiển thị nó như một cài đặt người dùng có thể truy cập được với giao diện người dùng out-of-box.
Ngăn không cho các cửa sổ tự ép mình ra phía trước và lấy nét là một tính năng kể từ Windows 2K (và tôi rất biết ơn vì điều đó).
Điều đó nói rằng, tôi có một ứng dụng Java nhỏ mà tôi sử dụng để nhắc nhở tôi ghi lại các hoạt động của tôi trong khi làm việc và nó tự đặt cửa sổ hoạt động sau mỗi 30 phút (tất nhiên là có thể định cấu hình). Nó luôn hoạt động nhất quán trong Windows XP và không bao giờ nhấp nháy cửa sổ thanh tiêu đề. Nó sử dụng mã sau, được gọi trong chuỗi giao diện người dùng do một sự kiện hẹn giờ kích hoạt:
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();
(dòng đầu tiên khôi phục nếu được thu nhỏ ... thực ra nó cũng sẽ khôi phục nếu được tối đa hóa, nhưng tôi chưa bao giờ làm như vậy).
Mặc dù tôi thường thu nhỏ ứng dụng này, nhưng thường thì nó chỉ nằm sau trình soạn thảo văn bản của tôi. Và, như tôi đã nói, nó luôn hoạt động.
Tôi có một ý tưởng về vấn đề của bạn có thể là gì - có lẽ bạn có một điều kiện chạy đua với lệnh gọi setVible (). toFront () có thể không hợp lệ trừ khi cửa sổ thực sự được hiển thị khi nó được gọi; Tôi đã gặp sự cố này với requestFocus () trước đây. Bạn có thể cần đặt lệnh gọi toFront () trong một trình nghe UI trên một sự kiện được kích hoạt cửa sổ.
2014-09-07: Tại một số thời điểm mã ở trên ngừng hoạt động, có lẽ ở Java 6 hoặc 7. Sau một số điều tra và thử nghiệm, tôi đã phải cập nhật mã để ghi đè toFront
phương thức của cửa sổ thực hiện việc này (kết hợp với mã sửa đổi từ những gì ở trên):
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);
}
Đối với Java 8_20, mã này dường như đang hoạt động tốt.