C# 在windows services中无法添加会话结束事件

tianqiDMC 2019-05-30 04:26:15
由于最近下班老是忘记打卡,我想写一个关机前提醒我打卡的弹窗,我用控制台在SystemEvents.SessionEnding里添加事件,能很好的运行,但是我把他做成服务后,发现失效了,里面的弹窗无法运行,SessionEndingEventArgs.Cancel也无法取消关机。请问这是什么原因呢。
代码如下:

public partial class Service1 : ServiceBase
{

public Service1()
{
InitializeComponent();
this.CanShutdown = true;
this.CanHandleSessionChangeEvent = true;

}

protected override void OnStart(string[] args)
{
Debugger.Launch();
SystemEvents.SessionEnding += MyEvent;
}

private void MyEvent(object sender, SessionEndingEventArgs e)
{
Interop.ShowMessageBox(e.Reason.ToString(), "title");
}

protected override void OnStop()
{

}


protected override void OnShutdown()
{
base.OnShutdown();
}


}
...全文
111 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2019-05-31
  • 打赏
  • 举报
回复
你使用winform,然后代码里设置托盘运行就可以了。 winservice 要UI交互的话相对隐藏winform要麻烦一点。
tianqiDMC 2019-05-31
  • 打赏
  • 举报
回复
引用 8 楼 耗子哭死猫 的回复:
写程序的都会把简单事情搞复杂,你下班关机是不是要把程序都关掉再点关机。桌面壁纸写上大大的4个字下班打卡。我不相信你真的会忽略过去
兄弟,我也想啊,关键是我们公司老板要求很严格,桌面都是统一的公司LOGO,不能改,不然发现一次就扣钱。。。
tianqiDMC 2019-05-31
  • 打赏
  • 举报
回复
引用 7 楼 stherix 的回复:
[quote=引用 5 楼 tianqiDMC 的回复:] [quote=引用 4 楼 stherix 的回复:] [quote=引用 3 楼 tianqiDMC 的回复:] [quote=引用 1 楼 stherix 的回复:] 服务不是运行在用户模式下的 常规手段没法访问用户UI 你这个需求,还不如把windows关机声音改成提示打卡
额。。。公司电脑没有音响- -。在服务属性里面有个是否允许交互,我勾上了,目前如果在OnStart和OnStop里面是可以调出弹窗的,显示UI界面没问题,就是在选择关机的时候,不出来弹窗,但是在控制台下又能很好的运行。。。[/quote] 服务会话结束的时候,windows的UI模块都已经停了吧,自然没有弹窗了 你说的OnStart能弹窗,开机的时候应该也是没有的,因为只有用户才有UI,而服务启动时机是更早[/quote] 对的,启动确实没UI,因为服务比UI早启动,但是我是用的SystemEvents.SessionEnding,这个API介绍的是用户尝试注销或者关机时调用,这个时候应该是点了关机立马会执行,因为我在控制台运行就是这样,这个时候UI模块还没有被关闭,只是到了服务里面就不行了。[/quote] 那弄个winform,Main里不显示窗体,等到注销的时候显示提示框,然后关闭程序就行了 加到自动启动里[/quote] 这个好像是这么个道理,我去试试。
wanghui0380 2019-05-30
  • 打赏
  • 举报
回复
解决vista和win7在windows服务中交互桌面权限问题:穿透Session 0 隔离 就是你这个帖子csdn做的智能推荐,虽然我们把csdn的广告都屏了,不过他这个智能推荐,我还是特意保留了。希望他们别又想着在这块加广告。(嘿嘿,如果你加广告,我还是屏。非跟程序员玩心眼!!)
耗子哭死猫 2019-05-30
  • 打赏
  • 举报
回复
写程序的都会把简单事情搞复杂,你下班关机是不是要把程序都关掉再点关机。桌面壁纸写上大大的4个字下班打卡。我不相信你真的会忽略过去
stherix 2019-05-30
  • 打赏
  • 举报
回复
引用 5 楼 tianqiDMC 的回复:
[quote=引用 4 楼 stherix 的回复:] [quote=引用 3 楼 tianqiDMC 的回复:] [quote=引用 1 楼 stherix 的回复:] 服务不是运行在用户模式下的 常规手段没法访问用户UI 你这个需求,还不如把windows关机声音改成提示打卡
额。。。公司电脑没有音响- -。在服务属性里面有个是否允许交互,我勾上了,目前如果在OnStart和OnStop里面是可以调出弹窗的,显示UI界面没问题,就是在选择关机的时候,不出来弹窗,但是在控制台下又能很好的运行。。。[/quote] 服务会话结束的时候,windows的UI模块都已经停了吧,自然没有弹窗了 你说的OnStart能弹窗,开机的时候应该也是没有的,因为只有用户才有UI,而服务启动时机是更早[/quote] 对的,启动确实没UI,因为服务比UI早启动,但是我是用的SystemEvents.SessionEnding,这个API介绍的是用户尝试注销或者关机时调用,这个时候应该是点了关机立马会执行,因为我在控制台运行就是这样,这个时候UI模块还没有被关闭,只是到了服务里面就不行了。[/quote] 那弄个winform,Main里不显示窗体,等到注销的时候显示提示框,然后关闭程序就行了 加到自动启动里
tianqiDMC 2019-05-30
  • 打赏
  • 举报
回复
有大佬帮解答一下吗,自己顶。。。
tianqiDMC 2019-05-30
  • 打赏
  • 举报
回复
引用 4 楼 stherix 的回复:
[quote=引用 3 楼 tianqiDMC 的回复:] [quote=引用 1 楼 stherix 的回复:] 服务不是运行在用户模式下的 常规手段没法访问用户UI 你这个需求,还不如把windows关机声音改成提示打卡
额。。。公司电脑没有音响- -。在服务属性里面有个是否允许交互,我勾上了,目前如果在OnStart和OnStop里面是可以调出弹窗的,显示UI界面没问题,就是在选择关机的时候,不出来弹窗,但是在控制台下又能很好的运行。。。[/quote] 服务会话结束的时候,windows的UI模块都已经停了吧,自然没有弹窗了 你说的OnStart能弹窗,开机的时候应该也是没有的,因为只有用户才有UI,而服务启动时机是更早[/quote] 对的,启动确实没UI,因为服务比UI早启动,但是我是用的SystemEvents.SessionEnding,这个API介绍的是用户尝试注销或者关机时调用,这个时候应该是点了关机立马会执行,因为我在控制台运行就是这样,这个时候UI模块还没有被关闭,只是到了服务里面就不行了。
stherix 2019-05-30
  • 打赏
  • 举报
回复
引用 3 楼 tianqiDMC 的回复:
[quote=引用 1 楼 stherix 的回复:] 服务不是运行在用户模式下的 常规手段没法访问用户UI 你这个需求,还不如把windows关机声音改成提示打卡
额。。。公司电脑没有音响- -。在服务属性里面有个是否允许交互,我勾上了,目前如果在OnStart和OnStop里面是可以调出弹窗的,显示UI界面没问题,就是在选择关机的时候,不出来弹窗,但是在控制台下又能很好的运行。。。[/quote] 服务会话结束的时候,windows的UI模块都已经停了吧,自然没有弹窗了 你说的OnStart能弹窗,开机的时候应该也是没有的,因为只有用户才有UI,而服务启动时机是更早
tianqiDMC 2019-05-30
  • 打赏
  • 举报
回复
引用 1 楼 stherix 的回复:
服务不是运行在用户模式下的 常规手段没法访问用户UI 你这个需求,还不如把windows关机声音改成提示打卡
额。。。公司电脑没有音响- -。在服务属性里面有个是否允许交互,我勾上了,目前如果在OnStart和OnStop里面是可以调出弹窗的,显示UI界面没问题,就是在选择关机的时候,不出来弹窗,但是在控制台下又能很好的运行。。。
tianqiDMC 2019-05-30
  • 打赏
  • 举报
回复
有没有大佬帮忙解答下,自己顶。。。
stherix 2019-05-30
  • 打赏
  • 举报
回复
服务不是运行在用户模式下的 常规手段没法访问用户UI 你这个需求,还不如把windows关机声音改成提示打卡

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧