如何在Windows XP上注销之前运行我的程序?
-
11-07-2019 - |
题
我寻找的 “RunOnceEx” 逆版本。
RunOnceEx并在用户的壳(桌面和任务栏)开始之前运行一些程序。登录进程将不会继续在runonceex完成之前。
我想要做的确切相同的,但在用户注销。 当她/他注销,所有正在运行的程序关闭,留下外壳(桌面和任务栏),然后点“”我希望我的程序将执行这一时刻“”,最后退出。
我认为这是可能的,因为“mobsync.exe”正在这样做。但我找不到在哪里以及如何做到这一点。
解决方案
要只为当前用户运行此,你可以使用WMI当关闭/退出时获得的信息。
要么你写一个小C#(或者可以使用WMI任何其他语言)应用程序或VBS脚本来侦听的 Win32_ComputerShutdownEvent 的WMI事件。
这是实施例C#应用程序可以在这里找到在这样一个问题:获得从注销事件系统
其他提示
警告作为所述的这里 ,gpedit.msc
将允许您配置注销脚本作为的所有的用户
如果您需要的脚本只有一个用户,则需要在注册表中直接宣告它,无论是在HKCU
和HKLM
。
如果要运行的程序,以注销执行代码,则应该钩住WM_QUERYENDSESSION
消息,并寻找lParam
(为0x80000000)的ENDSESSION_LOGOFF
值。
因为其他的人表示“强制关闭”重要的是要测试这个lParam
值。事实上,大多数关机/会话结束消息只是为了让你跑最后一分钟的清理代码的机会,是不是安全的,并具有长期运行的行动作出回应;但是这种特定组合应该确定。
注意:我从来没有尝试实际响应于WM_QUERYENDSESSION
消息运行一个单独的过程。这可能是因为窗口管理器将不允许这样,关闭期间喜欢它。试试看,我猜。
如果你在.NET环境中(没有指定),更快捷的方法是将事件处理程序添加到Microsoft.Win32.SystemEvents.SessionEnding
事件。
您需要的是 GINA <实现/ A>。您可以在 WlxIsLogoffOk 运行自定义命令函数,该函数被调用时用户启动注销
一旦你创建正确的dll的GINA你可以在这里注册:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\@GinaDLL
下面是可满足您的需求(它提供了在那里你可以指定你的命令注销注册表项)的实现: http://wwwthep.physik.uni-mainz.de/~弗林克/ newgina_pre09 / readme.html文件
作为VonC和TFD已经提到的,组策略编辑器是另一种操纵注册表。
只是要与gpedit的变化(USERCONFIG - Windows设置 - 脚本),你喜欢和事后采取在[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\Scripts]
注册表看看
找出你怎么可以直接做到这一点。
另外我的PC上(域中挂)是隐藏文件夹C:\WINDOWS\System32\GroupPolicy
与子文件夹的用户和机器。两者都具有所谓的关机和开机其他子文件夹。也许你也可以使用这些的。
如果您需要单个(或任何)简单的东西和工作的用户就可以使在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”)。