標準 Java API 無法直接監聽系統級滑鼠/鍵盤事件(僅限於自身視窗內)。
<dependency>
<groupId>com.1stleg</groupId>
<artifactId>JNativeHook</artifactId>
<version>2.2.2</version>
</dependency>
GlobalScreen.registerNativeHook();
GlobalScreen.addNativeMouseListener(new NativeMouseAdapter() {
@Override public void nativeMouseMoved(NativeMouseEvent e) { resetIdleTimer(); }
});
GlobalScreen.addNativeKeyListener(new NativeKeyAdapter() {
@Override public void nativeKeyPressed(NativeKeyEvent e) { resetIdleTimer(); }
});
Toolkit.getDefaultToolkit().addAWTEventListener(e -> {
if (e instanceof MouseEvent || e instanceof KeyEvent) resetIdleTimer();
}, AWTEvent.MOUSE_EVENT_MASK | AWTEvent.KEY_EVENT_MASK);
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
Runnable resetIdleTimer = () -> {
lastActiveTime = System.currentTimeMillis();
};
Runnable checkIdle = () -> {
if (System.currentTimeMillis() - lastActiveTime > 10 * 60 * 1000) {
// 設定使用者離線
setUserOffline();
}
};
scheduler.scheduleAtFixedRate(checkIdle, 1, 1, TimeUnit.MINUTES);