如何在 Windows XP 上注销之前运行我的程序?
Posted
技术标签:
【中文标题】如何在 Windows XP 上注销之前运行我的程序?【英文标题】:How to run my program on before logout on windows XP? 【发布时间】:2010-09-24 08:45:30 【问题描述】:我正在寻找“RunOnceEx”的反向版本。
RunOnceEx 确实在用户的 shell(桌面和任务栏)启动之前运行了一些程序。在 runonceex 完成之前,登录进度不会继续。
我想做完全相同的事情,但在用户注销时。 当她/他注销时,所有正在运行的程序都关闭,离开shell(桌面和任务栏),然后“我希望我的程序在这一刻执行”,最后注销。
我认为这是可能的,因为“mobsync.exe”正在这样做。但我找不到在哪里以及如何做。
【问题讨论】:
我要求一种“可编程”的方式 - 我可以在安装过程中设置它或在应用程序中设置一个选项。组策略很棒,但它不能解决要求。微软是否对“mobsync.exe”进行硬编码? 正如@VonC 所说,只需添加一些注册表项。这有多难! 您在寻找 C/C++ 或 .NET 的解决方案吗?此外,mobsync.exe 是一个 Microsoft 程序,并且很可能使用注册表项,就像您拒绝的所有答案一样。 【参考方案1】:警告,正如here 所说,gpedit.msc
将允许您为所有用户配置一个注销脚本。
如果您只需要一个用户的脚本,您需要直接在注册表中声明它,在HKCU
和HKLM
中。
【讨论】:
【参考方案2】:要仅为当前用户运行此功能,您可以使用 WMI 在发生关机/注销时获取信息。
您可以编写一个小型 C#(或任何其他可以使用 WMI 的语言)应用程序或 vbs 脚本来监听 Win32_ComputerShutdownEvent WMI 事件。
可以在此问题中找到示例 C# 应用程序:Get Log off event from system
【讨论】:
【参考方案3】:在谷歌的第一个结果中为我找到
要执行一个程序,您可以创建一个脚本来运行它并使用组策略来执行它。 在组策略编辑器中导航到用户配置-->Windows 设置-->脚本(登录/注销)
more information here
【讨论】:
正如我在 *** 中询问的,而不是超级用户,我正在寻找编程解决方案【参考方案4】:如果您希望正在运行的程序在注销时执行代码,那么您应该挂钩 WM_QUERYENDSESSION
消息并查找 ENDSESSION_LOGOFF
(0x80000000) 的 lParam
值。
测试这个lParam
值很重要,因为其他值表示“强制关闭” - 即您的进程可能在您的代码被允许运行之前被终止。事实上,大多数关闭/会话结束消息只是为了让您有机会运行最后一分钟的清理代码,并且对长时间运行的操作进行响应并不安全;但是这种特殊的组合应该没问题。
注意:我从未尝试实际运行单独的进程来响应WM_QUERYENDSESSION
消息。窗口管理器可能会禁止这样做,就像在关机期间一样。试试看,我猜。
如果您在 .NET 环境中(您没有指定),更快的方法是将事件处理程序添加到 Microsoft.Win32.SystemEvents.SessionEnding
事件。
【讨论】:
【参考方案5】:您需要的是GINA 的实现。您可以在WlxIsLogoffOk 函数中运行自定义命令,该函数在用户启动注销时调用
创建正确的 GINA dll 后,您可以在此处注册它:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\@GinaDLL
这是一个可能满足您需求的实现(它提供了一个注销注册表项,您可以在其中指定您的命令): http://wwwthep.physik.uni-mainz.de/~frink/newgina_pre09/readme.html
【讨论】:
+1,因为这是一个合法的答案,但我认为为这个人想要完成的事情实施 GINA dll 太过分了。【参考方案6】:正如 VonC 和 TFD 已经提到的,组策略编辑器只是操纵注册表的另一种方式。
只需使用 gpedit 进行更改(在用户配置 - Windows 设置 - 脚本中),然后查看[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\Scripts]
的注册表
了解如何直接做到这一点。
在我的电脑上(挂在域中)还有一个隐藏文件夹C:\WINDOWS\System32\GroupPolicy
,其中包含用于用户和机器的子文件夹。两者都有额外的子文件夹,称为 Shutdown 和 Startup。也许你也可以使用这些。
【讨论】:
【参考方案7】:如果您需要简单的东西并为单个(或任何)用户工作,您可以使用 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”)。
【讨论】:
以上是关于如何在 Windows XP 上注销之前运行我的程序?的主要内容,如果未能解决你的问题,请参考以下文章
如何让我的 VB.net 程序在 Windows XP 上运行?
如何在 xp 和 windows 7 上运行 SWT 应用程序
如何在 Windows 中从我的 VS2008/C++ 应用程序中执行一个程序来替换调用者并在 xp/vista/7 上运行?