Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从windows服务取消关机C_C#_Windows Services_C# 2.0_System Shutdown - Fatal编程技术网

C# 如何从windows服务取消关机C

C# 如何从windows服务取消关机C,c#,windows-services,c#-2.0,system-shutdown,C#,Windows Services,C# 2.0,System Shutdown,我有一个用C.net2.0编写的windows服务 我想检测计算机何时关闭/重新启动并取消它。 取消后,我要执行一些操作并重新启动windows 我试过了,但不管用 using Microsoft.Win32; partial class MyService: ServiceBase { protected override void OnStart(string[] args) { SystemEvents.SessionEnding += new Sessio

我有一个用C.net2.0编写的windows服务

我想检测计算机何时关闭/重新启动并取消它。 取消后,我要执行一些操作并重新启动windows

我试过了,但不管用

using Microsoft.Win32;
partial class MyService: ServiceBase
{
    protected override void OnStart(string[] args)
    {
        SystemEvents.SessionEnding += new SessionEndingEventHandler(OnSessionEnding);
    }

    private void OnSessionEnding(object sender, SessionEndingEventArgs e)
    {
        e.Cancel = true;
        //Do some work...
    }
}
另一项测试:

partial class MyService: ServiceBase
{
    protected override void OnShutdown()
    {
        //Do some work...
        //base.OnShutdown();
    }
}

我不会搞砸的。除非直接转到Win32 API,否则Windows会将您的进程视为挂起的进程

我的建议是注意你正在被关闭,也许安排活动在启动时进行

更新: 我想你会被困在这里,因为你的服务不知道为什么Windows会被关闭。您将有一个无限循环:

Windows关闭火灾。 服务通知、中止关机、启动应用程序。 用户使用应用程序继续关机。 窗口关闭火灾。 服务通知。。。。。。 等
我不会搞砸的。除非直接转到Win32 API,否则Windows会将您的进程视为挂起的进程

我的建议是注意你正在被关闭,也许安排活动在启动时进行

更新: 我想你会被困在这里,因为你的服务不知道为什么Windows会被关闭。您将有一个无限循环:

Windows关闭火灾。 服务通知、中止关机、启动应用程序。 用户使用应用程序继续关机。 窗口关闭火灾。 服务通知。。。。。。 等
我的建议是把你的行为写在一个文件或注册表中

DoSomething = true
DoSomethingElse = false

您可以在启动和处理过程中读取。

我的建议是将您的操作写入文件或注册表,例如

DoSomething = true
DoSomethingElse = false
您可以在OnStart和process中读取。

中止系统关机可能会起作用:

虽然我同意尼尔的观点,但这样做可能不是个好主意

编辑:添加了示例代码

using System.Runtime.InteropServices;

[DllImport("advapi32.dll", SetLastError=true)]
static extern bool AbortSystemShutdown(string lpMachineName);


if (!AbortSystemShutdown("localhost"))
{
    int err = Marshal.GetLastWin32Error();
}        
中止系统关机可能会起作用:

虽然我同意尼尔的观点,但这样做可能不是个好主意

编辑:添加了示例代码

using System.Runtime.InteropServices;

[DllImport("advapi32.dll", SetLastError=true)]
static extern bool AbortSystemShutdown(string lpMachineName);


if (!AbortSystemShutdown("localhost"))
{
    int err = Marshal.GetLastWin32Error();
}        

您可以使用shell命令shutdown-a中止关机。我不知道是否有可能检测到关机…

您可以使用shell命令shutdown-a中止关机。我不知道是否有可能检测到关机…

最后我放弃了检测并取消windows关机/重新启动的想法, 但是现在我只想检测shutdown-r-t xx

请注意,运行该程序的操作系统是Windows XP

我已经尝试过了,但是我没有WindowsXP的ExitCode:

Process process = new Process();

do
{
    process.StartInfo.FileName = "shutdown.exe";
    process.StartInfo.Arguments = "/a";
    process.Start();
    process.WaitForExit();
    MessageBox.Show(string.Format("ExitCode={0}",process.ExitCode));
    Thread.Sleep(1000);
}
while (process.ExitCode != 0) ;

最后,我放弃了检测并取消windows关闭/重新启动的想法, 但是现在我只想检测shutdown-r-t xx

请注意,运行该程序的操作系统是Windows XP

我已经尝试过了,但是我没有WindowsXP的ExitCode:

Process process = new Process();

do
{
    process.StartInfo.FileName = "shutdown.exe";
    process.StartInfo.Arguments = "/a";
    process.Start();
    process.WaitForExit();
    MessageBox.Show(string.Format("ExitCode={0}",process.ExitCode));
    Thread.Sleep(1000);
}
while (process.ExitCode != 0) ;

解决方案是使用winform检测关机:


但是Windows在我检测到其他进程之前就杀死了它,所以这不是更好的解决方案

解决方案是使用winform检测关机:


但是Windows在我检测到其他进程之前就杀死了它,所以这不是更好的解决方案

如何在C语言中使用AbortSystemShutdown函数?使用PInvoke。这里有一些关于它的信息,它很旧,但是有人有完整的代码样本吗?我在谷歌上找不到C语言的任何东西。只是不知道在我的代码中,在哪里使用你的例子中的每一行。我的意思是,我不知道在哪里放置DllImport部分,以及在哪里使用if语句进行拦截。提前谢谢。@user3916429请在此处查看:。这个问题的答案看起来很有帮助:如何在C语言中使用AbortSystemShutdown函数?使用PInvoke。这里有一些关于它的信息,它很旧,但是有人有完整的代码样本吗?我在谷歌上找不到C语言的任何东西。只是不知道在我的代码中,在哪里使用你的例子中的每一行。我的意思是,我不知道在哪里放置DllImport部分,以及在哪里使用if语句进行拦截。提前谢谢。@user3916429请在此处查看:。这个问题的答案看起来很有用:我不能在启动时执行活动,因为我希望在用户loggoff/shutdown/restart时从windows服务中获取winform应用程序。我的winform应用程序现在有一个按钮重新启动,另一个按钮提醒我稍后再启动,并做一些其他工作…@scrat:另一个否否,windows服务不是构建的,不应该用于与GUI的交互。@James he确实说过他的服务将启动另一个应用程序。@Neil,问题是取消后我想做一些动作。我看不出他在哪里说应该启动另一个应用程序?另外,通过设置一个标志可以很容易地避免无限循环…@James上面的评论是这样的:我不能在启动时进行活动,因为我希望在用户loggoff/shutdown/restart时从我的windows服务中获取winform应用程序。我的。我想你可以在某个地方插一面旗子,但那是不可能的
不明确,可能是某种注册表设置或某个文件。在我看来,这就像是为了让某些东西开始工作而进行的黑客攻击,而这在一开始并不一定是一个好主意。我不能在启动时进行活动,因为我想在用户登录退出/关闭/重新启动时从我的windows服务中获取winform应用程序。我的winform应用程序现在有一个按钮重新启动,另一个按钮提醒我稍后再启动,并做一些其他工作…@scrat:另一个否否,windows服务不是构建的,不应该用于与GUI的交互。@James he确实说过他的服务将启动另一个应用程序。@Neil,问题是取消后我想做一些动作。我看不出他在哪里说应该启动另一个应用程序?另外,通过设置一个标志可以很容易地避免无限循环…@James上面的评论是这样的:我不能在启动时进行活动,因为我希望在用户loggoff/shutdown/restart时从我的windows服务中获取winform应用程序。我的。我想您可以在某个地方设置一个标志,但这是不明确的,可能是某种注册表设置或某个文件。对我来说,这就像是黑客入侵,让某些东西开始工作,而这在一开始并不一定是个好主意。我已经用实际的示例代码修改了上面的答案,希望这些代码能够工作,这样你就不必启动这个进程了。@ho Windows在我检测到关闭之前杀死其他进程,所以这不是更好的解决方案。我决定在关机时检测超时窗口-r-t xx此时停止启动我的程序。在关机后检测超时窗口的解决方案-r-t xx基于检测窗口的标题:我已经用实际的示例代码修改了上面的答案,希望它能起作用,这样你就不必启动这个过程。@ho windows kill在我能够检测到关机之前的其他进程,所以这不是更好的解决方案。我决定在关机时检测超时窗口-r-t xx此时停止启动我的程序。关机后检测超时窗口的解决方案-r-t xx基于检测窗口标题: