Прервать выход из 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, чтобы закрыть, я вижу..

Окна отказываются закрываться

Еще более интересно то, что после того, как я нажал " Отмена" (черт, "Поиск НЛО" был следующим треком в очереди в плеере, и я не собирался его перепланировать:), я не мог нажать на фрейм. Казалось, что он был заблокирован с невидимым модальным диалогом. Я должен был убить ВМ, чтобы избавиться от него.

Другие вопросы по тегам