中止Windows从Java注销

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

主要目标平台是Windows Vista。

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

是否有可能停止从Java应用程序在Windows Vista上的注销进程?

我试过closures挂钩没有成功。

是否有可能停止从Java应用程序在Windows Vista上的注销进程?

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

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.addWindowlistner(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); 

然后,在您的JFrame上注册一个WindowAdapter 。 覆盖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.addWindowlistner( 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拒绝关闭

更有趣的是,在我点击取消 (heck,“搜索不明飞行物”是播放器中的下一个排队轨道,我不打算重新安排:),我不能点击框架。 它好像被一个不可见的模式对话框阻塞了。 我不得不杀死虚拟机来摆脱它。