中止Windows从Java注销

时间:2012-04-10 07:27:58

标签: java windows logoff

我有一个Swing应用程序,用户可以在其中创建和保存文档。该应用程序部署为一个简单的Jar文件。

主要目标平台是Windows Vista。

如果用户在应用程序中有已打开和未保存的文档,并且用户正在从Windows Vista计算机注销,我想暂停注销过程并询问用户是否要在之前保存到文档Java应用程序终止。

是否可以从Java应用程序暂停Windows Vista上的注销过程?

我尝试过关闭钩子没有成功。

2 个答案:

答案 0 :(得分:4)

  

是否可以从Java应用程序暂停Windows Vista上的注销过程?

不,也不可能。这就像是摇尾巴的尾巴。

答案 1 :(得分:2)

EDIT2


对于那些跟随讨论的人,我留下了我的第一个答案,但似乎他们没有工作。首先找到我真正的解决方案。

好的,所以我认为这实际上有效,但它并不完全可以接受,因为它使用了受限制的API部分(但它自Java 1.3以来一直存在,并且仍然存在于Java 1.7中)。它使用sun.misc.Signal。大部分代码最初由 Andrew Thompson 发布。

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的GUI应用程序。

JFrame中,设置以下内容:

setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);

然后,在WindowAdapter上注册JFrame。覆盖windowClosing()方法,然后打开一个阻止对话框,询问用户他想做什么(是/否/取消)。如果他选择,是的,你保存然后丢弃框架,如果他选择不,你只需丢弃框架。如果他选择取消,你什么都不做。


编辑:

以下是一些代码以及有关我正在解释的内容以及 Andrew Thompson 带来的更多细节。所有学分应归他所有:

使用此代码:

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关闭,我看到..

Windows refusing to shut-down

更有趣的是,在我点击取消之后(哎呀,'搜索UFO'是播放器中的下一个排队轨道,而我不打算重新安排它:),我无法点击在框架上。似乎它被一个看不见的模态对话框阻挡了。我不得不杀掉虚拟机来摆脱它。