我正在寻找一个“RunOnceEx”的反向版本。
RunOnceEx会在用户的桌面和任务栏启动之前运行某些程序。登录进程在runonceex完成之前不会继续进行。
我想要做完全相同的事情,但是在用户注销时。
当她/他注销时,所有正在运行的程序都会关闭,只留下shell(桌面和任务栏),然后“我希望我的程序将在此时执行”,最后注销。
我认为这是可能的,因为“mobsync.exe”正在这样做。但我找不到在哪里以及如何做到这一点。
我正在寻找一个“RunOnceEx”的反向版本。
RunOnceEx会在用户的桌面和任务栏启动之前运行某些程序。登录进程在runonceex完成之前不会继续进行。
我想要做完全相同的事情,但是在用户注销时。
当她/他注销时,所有正在运行的程序都会关闭,只留下shell(桌面和任务栏),然后“我希望我的程序将在此时执行”,最后注销。
我认为这是可能的,因为“mobsync.exe”正在这样做。但我找不到在哪里以及如何做到这一点。
WM_QUERYENDSESSION
消息并查找值为 ENDSESSION_LOGOFF
(0x80000000)的 lParam
值。lParam
值非常重要,因为其他值表示“强制关闭”,即您的进程可能会在允许运行代码之前被终止。实际上,大多数关机/会话结束消息仅旨在提供最后一分钟的清理代码运行的机会,并不安全,因为响应长时间运行的操作;但是这种特定组合应该是可以的。WM_QUERYENDSESSION
消息时实际运行单独的进程。窗口管理器可能会像在关机期间那样拒绝此操作。尝试并查看吧。Microsoft.Win32.SystemEvents.SessionEnding
事件添加事件处理程序。我在Google的第一个搜索结果中找到了以下内容:
要执行程序,您可以创建一个脚本来运行它,并使用组策略来强制执行它。 在组策略编辑器中,导航到用户配置-->Windows设置-->脚本(登录/注销)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\@GinaDLL
这是一个可能适合您需求的实现(它提供了一个注销注册表键,您可以在其中指定您的命令):
http://wwwthep.physik.uni-mainz.de/~frink/newgina_pre09/readme.html
正如VonC和TFD所提到的,组策略编辑器只是操作注册表的另一种方式。
只需使用gpedit进行更改(在用户配置文件 - Windows设置 - 脚本中),然后查看注册表中的[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\Scripts]
,以了解如何直接进行更改。
此外,在我的电脑(挂在域中)上有一个隐藏的文件夹C:\WINDOWS\System32\GroupPolicy
,其中包含用户和计算机的子文件夹。两者都有名为Shutdown和Startup的其他子文件夹。也许您也可以使用这些文件夹。
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”)。