none
【C#】windowsServer中 如何实现像webform那样弹出对话框呢? RRS feed

  • 问题

  • 我做了一个WindowsServer 用来监视表中的数据是否满足一定条件,当满足条件的时候弹出一个对话框,予以警告。现在问题是条件都可以实现了,就是不知道如何弹出对话框。使用MessageBox.Show("内容"); 编译运行后服务出错。请高手指教,我应该如何来做,谢谢!


    买海参选煜诚 煜诚海参 真心品质 http://jinweb.taobao.com
    2010年11月17日 8:49

答案

  • Hi junwb1982,

    Thanks for your post!


    您是指的Windows Services吧, Windows Services没有任何UI (在管理模板里看到的只是Service的名称,描述以及进城文件名等等),<del>所以您尝试弹出Windows消息框是不可能的 </del> ,除非设置Windows Service以用户方式运行(需要管理员权限)并允许与桌面有交互。
    请参考:

    http://msdn.microsoft.com/en-us/library/d56de412%28VS.80%29.aspx

     

    如果您希望给使用者某些提示,您可以使用写文件Log,写注册表,写Windows Event,或者发Email等等都可以的。


    Please feel free to let me know if you have any further issues, thanks!



    Happy Coding:)
    Wayne Ye - Senior Software Development Engineer
    Personal Website:   http://WayneYe.com


    • 已标记为答案 jinwb1982 2010年11月18日 1:09
    • 取消答案标记 jinwb1982 2010年11月18日 1:09
    • 已标记为答案 jinwb1982 2010年11月18日 7:35
    2010年11月17日 8:58
  • 你好!

    两种方式:

    1 在 Windows 服务属性中将“允许桌面与服务交互”打钩。

    2 专门写一个客户端Windows 服务即时发送消息通知客户端显示指定的信息。


    知识改变命运,奋斗成就人生!
    • 已标记为答案 jinwb1982 2010年11月18日 1:08
    • 取消答案标记 jinwb1982 2010年11月18日 1:09
    • 已标记为答案 jinwb1982 2010年11月18日 7:35
    2010年11月17日 8:58
    版主
  • 你好!

    不需要,依次打开控制面版 -- 管理工具 -- 服务 -- 选中你的服务点开属性窗口即能看到。如果条件允许采用第2种方式会更好。

     


    知识改变命运,奋斗成就人生!
    • 已标记为答案 jinwb1982 2010年11月18日 1:08
    • 取消答案标记 jinwb1982 2010年11月18日 1:09
    • 已标记为答案 jinwb1982 2010年11月18日 7:35
    2010年11月17日 15:22
    版主

全部回复

  • Hi junwb1982,

    Thanks for your post!


    您是指的Windows Services吧, Windows Services没有任何UI (在管理模板里看到的只是Service的名称,描述以及进城文件名等等),<del>所以您尝试弹出Windows消息框是不可能的 </del> ,除非设置Windows Service以用户方式运行(需要管理员权限)并允许与桌面有交互。
    请参考:

    http://msdn.microsoft.com/en-us/library/d56de412%28VS.80%29.aspx

     

    如果您希望给使用者某些提示,您可以使用写文件Log,写注册表,写Windows Event,或者发Email等等都可以的。


    Please feel free to let me know if you have any further issues, thanks!



    Happy Coding:)
    Wayne Ye - Senior Software Development Engineer
    Personal Website:   http://WayneYe.com


    • 已标记为答案 jinwb1982 2010年11月18日 1:09
    • 取消答案标记 jinwb1982 2010年11月18日 1:09
    • 已标记为答案 jinwb1982 2010年11月18日 7:35
    2010年11月17日 8:58
  • 你好!

    两种方式:

    1 在 Windows 服务属性中将“允许桌面与服务交互”打钩。

    2 专门写一个客户端Windows 服务即时发送消息通知客户端显示指定的信息。


    知识改变命运,奋斗成就人生!
    • 已标记为答案 jinwb1982 2010年11月18日 1:08
    • 取消答案标记 jinwb1982 2010年11月18日 1:09
    • 已标记为答案 jinwb1982 2010年11月18日 7:35
    2010年11月17日 8:58
    版主
  • Windows 服务运行在非 INTERACTIVE 会话模式下,对所有需要 Interactive 的 API 均无法响应。所以,如果需要弹出 MessageBox 的话,就不能用 Windows Service 应用程序,而改用普通的 Windows Forms 应用程序,然后隐藏其主窗体,设置其开机就启动。
    Mark Zhou
    2010年11月17日 9:01
  • To 肖小勇,

    看了下,让Service以local用户方式运行是可以的,学习了,谢谢!

    2010年11月17日 9:08
  • To 肖小勇,

    看了下,让Service以local用户方式运行是可以的,学习了,谢谢!


    我的建议是,虽然,Windows Service 可以被强制进入 Interactive 模式,或者利用 LOCAL 账户以便实现用户会话,但其安全性有很大的 risk,一般,LOCAL SERVICE 的应用场合,是 Windows 核心服务,或者低于普通线程优先级的重要 Idle 型服务,不建议用户自己的服务注册成这种模式,否则,会给很多不良程序员可乘之机。。。

    一个比较好的例子,就像楼上说的,服务只管处理,而通知则利用其它的方法,如利用其它进程,或渠道。


    Mark Zhou
    2010年11月17日 9:21
  • u你好!

    两种方式:

    1 在 Windows 服务属性中将“允许桌面与服务交互”打钩。

    2 专门写一个客户端Windows 服务即时发送消息通知客户端显示指定的信息。


    知识改变命运,奋斗成就人生!

    大体看了一下。似乎好像只有服务端与其相对应的客户端才能实现这种功能!不过上面这位朋友提到的"在 Windows 服务属性中将“允许桌面与服务交互”打钩" 不知道这是在哪里设置?难道这也需要客户端服务程序吗?

    买海参选煜诚 煜诚海参 真心品质 http://jinweb.taobao.com
    2010年11月17日 14:13
  • 你好!

    不需要,依次打开控制面版 -- 管理工具 -- 服务 -- 选中你的服务点开属性窗口即能看到。如果条件允许采用第2种方式会更好。

     


    知识改变命运,奋斗成就人生!
    • 已标记为答案 jinwb1982 2010年11月18日 1:08
    • 取消答案标记 jinwb1982 2010年11月18日 1:09
    • 已标记为答案 jinwb1982 2010年11月18日 7:35
    2010年11月17日 15:22
    版主
  • 你好!

    不需要,依次打开控制面版 -- 管理工具 -- 服务 -- 选中你的服务点开属性窗口即能看到。如果条件允许采用第2种方式会更好。

     


    知识改变命运,奋斗成就人生!


    感谢你的回答。还要顺便问一个问题。这种桌面交互是不是必须操作人是系统管理员。由于我的项目是一个OA系统。服务只是用来判断数据库表中的数据是否满足条件,而这些数据是用户填写的,我的理解就是用户属于IIS来宾账户隶属于Guests组。是不是说就不能引起服务事件了呢?


    买海参选煜诚 煜诚海参 真心品质 http://jinweb.taobao.com
    2010年11月18日 1:13
  • 你好!

    不需要,依次打开控制面版 -- 管理工具 -- 服务 -- 选中你的服务点开属性窗口即能看到。如果条件允许采用第2种方式会更好。

     


    知识改变命运,奋斗成就人生!


    感谢你的回答。还要顺便问一个问题。这种桌面交互是不是必须操作人是系统管理员。由于我的项目是一个OA系统。服务只是用来判断数据库表中的数据是否满足条件,而这些数据是用户填写的,我的理解就是用户属于IIS来宾账户隶属于Guests组。是不是说就不能引起服务事件了呢?


    买海参选煜诚 煜诚海参 真心品质 http://jinweb.taobao.com
    dear
    您先想想用SERVICE的目的是啥?我会用SERVICE的话是为了要在背景执行(无UI画面),或是开机就执行与使用者互动(无UI画面)
    若SERVICE在背景执行,透过他去呼叫的程式也会在背景执行

    1.服务的设定更改要有一定的权限,基本上只要改一次

    2.依你的需求你可能需要两支程式,一支在背景一支在前景

    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2010年11月18日 2:06
  • 你好!

    不需要,依次打开控制面版 -- 管理工具 -- 服务 -- 选中你的服务点开属性窗口即能看到。如果条件允许采用第2种方式会更好。

     


    知识改变命运,奋斗成就人生!


    感谢你的回答。还要顺便问一个问题。这种桌面交互是不是必须操作人是系统管理员。由于我的项目是一个OA系统。服务只是用来判断数据库表中的数据是否满足条件,而这些数据是用户填写的,我的理解就是用户属于IIS来宾账户隶属于Guests组。是不是说就不能引起服务事件了呢?


    买海参选煜诚 煜诚海参 真心品质 http://jinweb.taobao.com
    dear
    您先想想用SERVICE的目的是啥?我会用SERVICE的话是为了要在背景执行(无UI画面),或是开机就执行与使用者互动(无UI画面)
    若SERVICE在背景执行,透过他去呼叫的程式也会在背景执行

    1.服务的设定更改要有一定的权限,基本上只要改一次

    2.依你的需求你可能需要两支程式,一支在背景一支在前景

    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    我做了一个服务主要是用来对比数据库表中的时间,如果当前时间与对比时间相等,或当前时间大于对比时间,就执行一定操作(发短信)看了下系统的其他服务,发现大部分都是本地系统账户。如MSSQL服务 这个问题现在应该可以解决了。我仔细想了一下:之前有朋友说服务必须是管理员才能操作,而我的服务安装都是以管理员身份进行的,甚至运行。而我把这个问题想歪了。总以为服务部署以后,用户使用系统,服务监视数据库。这3者都是需要管理员操作的。但仔细想想不是这么回事。呵呵,感谢大家的回答!

    买海参选煜诚 煜诚海参 真心品质 http://jinweb.taobao.com
    2010年11月18日 7:29