unity windows

我想要在系统关机的时候程序发送一个关闭投影的指令
我用的是OnApplicationQuit这个方法,在Windows关闭我程序的时候,我的程序发出指令关闭投影
然后好像我的指令还没发送完,Windows就已经清理缓存完成直接关机了,导致指令没有成功发送出去
有没有什么方法推迟关机这个指令让我程序做完指令发送之后再进行关机呢?

以下答案引用自GPT-3大模型,请合理使用:

实现。

你可以使用Unity的Application.Quit()方法来推迟系统关机,该方法将停止游戏并调用OnApplicationQuit事件,你可以在OnApplicationQuit事件中发送投影指令,然后再调用Application.Quit()方法关闭程序:

void OnApplicationQuit() 
{ 
  // 发送投影指令
  //... 
    Application.Quit(); 
}

如果我的回答解决了您的问题,请采纳我的回答

在 Windows 操作系统中,系统关机会发送 WM_QUERYENDSESSION 和 WM_ENDSESSION 消息给应用程序。在收到 WM_ENDSESSION 消息之后,操作系统会在约 5 秒钟的时间内结束所有进程并关闭系统。

如果你的程序需要在系统关机时完成一些操作,可以尝试在 OnApplicationQuit 方法中取消系统关机操作,等待程序完成指令发送操作后再手动触发系统关机操作。以下是一个示例代码:

private const int WM_QUERYENDSESSION = 0x0011;
private const int WM_ENDSESSION = 0x0016;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_QUERYENDSESSION)
    {
        // 取消系统关机操作
        m.Result = (IntPtr)0;
    }
    else if (m.Msg == WM_ENDSESSION)
    {
        // 发送关闭投影指令
        SendCloseProjectionCommand();

        // 执行关机操作
        Process.Start("shutdown", "/s /t 0");
    }
    else
    {
        base.WndProc(ref m);
    }
}


在上面的代码中,我们重写了窗口消息处理方法 WndProc,并且处理了 WM_QUERYENDSESSION 和 WM_ENDSESSION 消息。当收到 WM_QUERYENDSESSION 消息时,我们将消息结果设置为 0,取消系统关机操作。当收到 WM_ENDSESSION 消息时,我们首先执行发送关闭投影指令的操作,然后手动触发系统关机操作。这样,我们就可以在程序完成指令发送之后再进行关机操作,从而避免了指令未发送完就被系统关闭的问题。

请注意,在这种情况下,用户必须手动重启或关闭电脑。如果你需要在程序完成指令发送之后自动重新启动计算机,请将参数 "/r" 传递给 shutdown 命令。

可以通过系统注册表进行设置,延长系统关机的等待时间,让程序有足够的时间来发送关闭投影的指令。

具体操作步骤如下:

1.打开注册表编辑器(regedit.exe);
2.在左侧导航栏中找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control;
3.找到 WaitToKillServiceTimeout 键值,如果不存在可以右键新建一个 DWORD 值;
4.将 WaitToKillServiceTimeout 的值修改为需要延迟的时间,单位为毫秒(比如设置为 30000 表示延迟30秒);
5.保存注册表并重启计算机生效。
这样,在系统关闭的时候,Windows 会等待指定时间,如果程序还没有完成操作,则会弹出提示框提示用户等待或强制关闭。

需要注意的是,延迟时间不能太长,否则会对系统关闭产生负面影响,建议根据实际需要设置一个合理的值。