Прервать выход из Windows с Java
У меня есть приложение Swing, в котором пользователь может создавать и сохранять документы. Приложение развернуто в виде простого Jar-файла.
Основной целевой платформой является Windows Vista.
Если у пользователя есть открытый и несохраненный документ в приложении, и пользователь выходит из системы с Windows Vista, я бы хотел остановить процесс выхода из системы и спросить пользователя, хочет ли он сохранить документ до того, как приложение Java будет прекращается.
Можно ли остановить процесс выхода из системы в Windows Vista из приложения Java?
Я попытался отключить крюк без успеха.
2 ответа
Можно ли остановить процесс выхода из системы в Windows Vista из приложения Java?
Нет и не должно быть возможно. Это как хвост, виляющий собакой.
EDIT2
Для тех, кто следил за обсуждением, я оставляю первые ответы, которые у меня были, но кажется, что они не работают. Сначала найди мое реальное решение.
Итак, я думаю, что это на самом деле работает, но это не совсем приемлемо, поскольку в нем использовалась ограниченная часть API (но она существует с Java 1.3 и все еще присутствует в Java 1.7). Он использует sun.misc.Signal. Большая часть кода была первоначально опубликована Эндрю Томпсоном.
import java.awt.AWTEvent;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import sun.misc.Signal;
import sun.misc.SignalHandler;
class TestShutDown {
static final String WINDOW_MODIFIED = "windowModified";
TestShutDown() {
final JFrame f = new JFrame("Log Off!");
f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
System.err.println("Window closing");
handleQuit(f);
}
});
Signal.handle(new Signal("TERM"), new SignalHandler() {
@Override
public void handle(Signal arg0) {
handleQuit(f);
}
});
// bad practice, but not the point..
f.setSize(400, 200);
f.setLocationByPlatform(true);
f.setVisible(true);
}
protected static void handleQuit(final JFrame f) {
int result = JOptionPane.showConfirmDialog(f, "Close Me");
if (result == JOptionPane.OK_OPTION) {
System.exit(0);
}
}
public static void main(String[] args) {
// start the GUI on the EDT
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestShutDown();
}
});
}
}
РЕШЕНИЕ ПРЕДЛАГАЕТСЯ РАНЬШЕ (НЕ РАБОТАЕТ НА LOGOFF)
Я предполагаю, что вы используете приложение с графическим интерфейсом JFrame
,
В вашем JFrame
установите следующее:
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
Затем зарегистрируйте WindowAdapter
на ваше JFrame
, Переопределить windowClosing()
метод и оттуда откройте диалоговое окно блокировки, чтобы спросить пользователя, что он хочет сделать (Да / Нет / ОТМЕНА). В случае, если он выбирает "ДА", вы сохраняете и затем удаляете рамку, в случае, если он выбирает "НЕТ", вы просто распоряжаетесь рамкой. Если он выберет "Отмена", вы ничего не делаете.
РЕДАКТИРОВАТЬ:
Вот некоторый код и больше деталей о том, что я объяснял и что принес Эндрю Томпсон. Все кредиты должны идти к нему для следующего:
Используя этот код:
import java.awt.event.*;
import javax.swing.*;
class TestShutDown {
TestShutDown() {
final JFrame f = new JFrame("Log Off!");
f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
f.addWindowListener( new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
int result = JOptionPane.showConfirmDialog(f, "Close Me");
if (result==JOptionPane.OK_OPTION) {
System.exit(0);
}
}
});
// bad practice, but not the point..
f.setSize(400,200);
f.setLocationByPlatform(true);
f.setVisible(true);
}
public static void main(String[] args) {
// start the GUI on the EDT
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestShutDown();
}
});
}
}
Затем говорю Windows, чтобы закрыть, я вижу..
Еще более интересно то, что после того, как я нажал " Отмена" (черт, "Поиск НЛО" был следующим треком в очереди в плеере, и я не собирался его перепланировать:), я не мог нажать на фрейм. Казалось, что он был заблокирован с невидимым модальным диалогом. Я должен был убить ВМ, чтобы избавиться от него.