如何在Windows XP上注销之前运行我的程序?

时间:2008-11-27 16:51:03

标签: windows-xp registry logout runonce

我正在寻找“RunOnceEx”的逆版本。

RunOnceEx在用户的shell(桌面和任务栏)启动之前运行一些程序。在runonceex完成之前,登录进度不会继续。

我希望在用户注销时完全相同。 当她/他退出时,所有正在运行的程序关闭,离开shell(桌面和任务栏),然后“”我希望我的程序将在此时执行“”,最后退出。

我认为这是可能的,因为“mobsync.exe”正在这样做。但我找不到在哪里以及如何做到这一点。

7 个答案:

答案 0 :(得分:7)

警告,如上所述heregpedit.msc将允许您为所有用户配置注销脚本

如果您只需要一个用户使用该脚本,则需要在HKCUHKLM中直接在注册表中声明它。

答案 1 :(得分:4)

要仅为当前用户运行此功能,您可以使用WMI在发生关闭/注销时获取信息。

您可以编写一个小的C#(或任何其他可以使用WMI的语言)应用程序或vbs脚本来监听 Win32_ComputerShutdownEvent WMI事件。

可以在此问题中找到示例C#应用:Get Log off event from system

答案 2 :(得分:3)

在google上找到我的第一个结果

要执行程序,您可以创建一个脚本来运行它,并使用组策略来强制执行它。 在组策略编辑器中,导航到用户配置 - > Windows设置 - >脚本(登录/注销)

more information here

答案 3 :(得分:3)

如果您希望正在运行的程序在注销时执行代码,那么您应该挂钩WM_QUERYENDSESSION消息并查找lParamENDSESSION_LOGOFF(0x80000000)。

测试此lParam值非常重要,因为其他值表示“强制关闭” - 即您的进程可能会在您的代码被允许运行之前被终止。事实上,大多数关闭/会话结束消息只是为了让您有机会运行最后一分钟的清理代码,并且不能安全地响应长时间运行的操作;但这个特殊的组合应该没问题。

注意:我从未尝试过实际运行单独的流程来响应WM_QUERYENDSESSION消息。窗口管理器可能会禁用此功能,就像在关机期间一样。试试看,我想。

如果您在.NET环境中(未指定),则更快捷的方法是向Microsoft.Win32.SystemEvents.SessionEnding事件添加事件处理程序。

答案 4 :(得分:1)

您需要的是GINA的实施。您可以在WlxIsLogoffOk函数中运行自定义命令,该函数在用户启动注销时被调用

创建正确的GINA dll后,您可以在此处注册:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\@GinaDLL

这是一个可以满足您需求的实现(它提供了一个Logoff注册表项,您可以在其中指定命令): http://wwwthep.physik.uni-mainz.de/~frink/newgina_pre09/readme.html

答案 5 :(得分:1)

正如VonC和TFD已经提到的那样,组策略编辑器只是操纵注册表的另一种方式。

只需使用gpedit更改您喜欢的更改(在Userconfig - Windows设置 - 脚本中),然后在[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\Scripts]的注册表中查看 找出你如何直接做到这一点。

同样在我的电脑上(挂在一个域中)是一个隐藏文件夹C:\WINDOWS\System32\GroupPolicy,其中包含用户和机器的子文件夹。两者都有额外的子文件夹叫做Shutdown和Startup。也许你也可以使用这些。

答案 6 :(得分:0)

如果您需要一些简单且适用于单个(或任何)用户的东西,您可以在C ++或C#中创建一个简单的应用程序。

最简单的是在托盘中放置一个C#(通过简单地将托盘组件添加到表单中)以及 FormClosing 事件的注册和事件处理程序。它看起来像这样:

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (e.CloseReason != CloseReason.UserClosing)
        {
            // It's not the user closing the application,
            // Let's do whatever you want here, for example starting a process
            Process notePad = new Process();

            notePad.StartInfo.FileName   = "notepad.exe";
            notePad.StartInfo.Arguments = "ProcessStart.cs";

            notePad.Start();
        }
    }

因此,您的应用程序将以Windows或用户身份启动。它将等待(使用一点内存)并在系统关闭或用户注销等时执行某些操作(通过检查上面的“CloseReason”)。