我有一个Swing应用程序,用户可以在其中创建和保存文档。该应用程序部署为一个简单的Jar文件。
主要目标平台是Windows Vista。
如果用户在应用程序中有已打开和未保存的文档,并且用户正在从Windows Vista计算机注销,我想暂停注销过程并询问用户是否要在之前保存到文档Java应用程序终止。
是否可以从Java应用程序暂停Windows Vista上的注销过程?
我尝试过关闭钩子没有成功。
答案 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关闭,我看到..
更有趣的是,在我点击取消之后(哎呀,'搜索UFO'是播放器中的下一个排队轨道,而我不打算重新安排它:),我无法点击在框架上。似乎它被一个看不见的模态对话框阻挡了。我不得不杀掉虚拟机来摆脱它。