C# 如何从windows服务取消关机C
我有一个用C.net2.0编写的windows服务 我想检测计算机何时关闭/重新启动并取消它。 取消后,我要执行一些操作并重新启动windows 我试过了,但不管用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
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基于检测窗口标题: