Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
中止Windows从Java注销_Java_Windows_Logoff - Fatal编程技术网

中止Windows从Java注销

中止Windows从Java注销,java,windows,logoff,Java,Windows,Logoff,我有一个Swing应用程序,用户可以在其中创建和保存文档。应用程序部署为一个简单的Jar文件 主要目标平台是Windows Vista 如果用户在应用程序中打开了未保存的文档,并且用户正在从Windows Vista计算机注销,我希望停止注销过程,并询问用户是否希望在Java应用程序终止之前保存到文档 是否可以从Java应用程序停止Windows Vista上的注销过程 我尝试过关闭挂钩,但没有成功 是否可以从Java应用程序停止Windows Vista上的注销过程 不,这也不可能。这就像尾巴

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

主要目标平台是Windows Vista

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

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

我尝试过关闭挂钩,但没有成功

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

不,这也不可能。这就像尾巴摇狗一样。

EDIT2


对于那些关注讨论的人,我留下了我的第一个答案,但它们似乎不起作用。首先找到我真正的解决办法

好的,所以我认为这实际上是可行的,但它不是完全可以接受的,因为它使用了API的受限部分(但它从Java1.3开始就存在,并且仍然存在于Java1.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();
            }
        });
    }
}

先前建议的解决方案(不适用于注销)

我假设您正在使用带有
JFrame
的GUI应用程序

JFrame
中,设置以下内容:

setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
然后,在
JFrame
上注册
WindowAdapter
。覆盖
windowClosing()
方法,并从中打开一个阻止对话框,询问用户想要做什么(是/否/取消)。如果他选择了,是的,您保存并处理帧,如果他选择了否,您只处理帧。如果他选择取消,你什么都不做


编辑:

下面是一些代码和更多关于我刚才解释的内容的详细信息,这些都是由安德鲁·汤普森带来的。以下各项的所有学分应归他所有:

setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
使用此代码:

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”是播放器中的下一个排队轨道,我不打算重新安排它:)之后,我无法点击帧。它似乎被一个不可见的模态对话框阻塞了。我必须杀死虚拟机才能摆脱它。

“我尝试了关闭钩子,但没有成功。”试着发布你的最佳尝试。要么我误解了什么,要么行为是询问每个编辑应用程序(Word、Notepad++、Eclipse等)都在做什么,即询问用户是否想保存其更改,放弃它们或取消当前关闭过程。我认为这样做没有任何问题。最后,Windows会询问您是否要终止进程或取消关机。我关注的是“从Windows Vista计算机注销”一词。您的建议在用户退出我们的应用程序时适用,但不适用于退出操作系统。是的,但事实上,我所建议的方法确实有效,您可以停止注销过程。Windows将首先尝试关闭所有应用程序框架。如果进程没有在某个时间间隔(大约30秒)内结束,Windows将询问您是想强制关闭应用程序还是取消注销进程,也就是说,这将取消退出操作系统。(重新考虑)实际上,您可能是对的。但是需要一个关机钩子才能检测到这种情况,不是吗?@AndrewThompson看起来我在这个问题上错了。我原以为它会被windowClosing事件捕获,但看起来似乎不是(至少它在Win7-64位Java 1.6.0_24-64位、1.6.0_26-64位、1.6.0_31-64位和1.7.0_u2-64位上不起作用,在Win7-64位Java 1.6.0_24-32位上也不起作用,在WinXP32位Java 1.7.0_u3-32位上也不起作用)。要么程序关闭,要么帧挂起。没有一个是好的。我想我们可以试着捕捉一个特定的信号并采取行动,但也许我应该就此事提出一个问题。谢谢你的快速回答。我尝试了上面的代码,但没有成功。Java进程在未显示对话框的情况下被终止。请提供更多详细信息。您是否看到与上面所示类似的屏幕?那时候你在听酸性舞曲吗?(好吧,只是开个玩笑;)你从屏幕上选择了什么选项。。我运行Java代码TestShutdown,得到一个漂亮的灰色JFrame。如果我点击十字架来关闭框架,当我在Windows“开始”菜单中选择“注销”时,会出现JOPtionPane。我没有任何问题就注销了,我没有看到对话框“XX程序仍然需要关闭:”。Java应用程序刚刚终止。如果我启动记事本,打开一个未保存的文档并注销,我会得到“XX程序仍需关闭:”的文本,即是记事本阻止Windows关闭。Java版本:1.6.0_16 Windows Vista Enterprise SP2 32-bit@Mattias我将研究这一点,因为我有另一个程序,它使用完全相同的技术,它的工作方式就像charm@Mattias看来我在这个问题上错了。我原以为它会被windowClosing事件捕获,但看起来似乎不是(至少它在Win7-64位Java 1.6.0_24-64位、1.6.0_26-64位、1.6.0_31-64位和1.7.0_u2-64位上不起作用,在Win7-64位Java 1.6.0_24-32位上也不起作用,在WinXP32位Java 1.7.0_u3-32位上也不起作用)。要么程序关闭,要么帧挂起。没有一个是好的。我认为我们可以试着抓住一个特定的信号并采取行动,但也许我应该就此提出一个问题。