`
leogao_emcom
  • 浏览: 82973 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Windows Service开发的一个经典问题

阅读更多

很多人这样设计Windows Service,希望在某种条件下,比如某个事件发生后,希望Windows Service弹出一个窗体!

其实这非常不正确,不管是C#,VB.net还是C++创建的Windows Service是被OS windows子系统调用的和维护的,

恰恰它没有桌面站,OS在启动Windows子系统的时候,会默认创建两类东西,就是有窗口站的桌面(其实也是一个窗口以及窗口树结构),另外一个就是无窗口站的环境,Windows Service恰恰运行在这个环境中,其含义是没有客户操作区的表面,那么即使你在Windows Service的OnStart方法中new一个Window对象并调用其Show方法,你也看不到有窗体弹出!

 

但是你可以使用一个办法绕过这个限制,那就是使用Windows Service作为服务器端,做一个WCF/Remoting服务,

让一个独立进程(最好系统一起启动的)作为客户端,使用双向回调实现的观察者模式(可以使用委托实现,或者WCF就支持回调的方式,不过需要绑定也支持两个通道,并且回调的行为必须是OneWay的),服务在某个条件下通知被注册的客户端,此时客户端程序就可以有所动作,因为一个exe程序(Console等等)是在有窗口站的环境下运行的,那么它们在接收到服务器通知后就可以弹出一个可以看见的窗体了。

 

 

 

分享到:
评论
11 楼 leogao_emcom 2011-02-25  
正解!我看此课题可以结案了。good!感谢大家
10 楼 leogao_emcom 2011-02-25  
OK!问题解决,不使用show方法,而是ShowDialog方法!
public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {

            Form ooo = new Form();
            ooo.ShowDialog();
        }

        protected override void OnStop()
        {

        }
    }
再加上:在开发模式下,在为Service添加的ServiceProcessInstaller属性中的Account设置为LocalSystem,然后编译,使用installutil进行安装到windows Service编录(管理器),然后在对应的服务属性中【登录】页中,设置本地系统账户的【允许与桌面交互】选项被选中,最后启动服务,此时桌面就会显示出来。并且UI可以正常操作了。
9 楼 leogao_emcom 2011-02-25  
哇哇,窗体是出来了,但是在UI上无法进行操作?我没有找到问题所在。需要再继续探讨一下
8 楼 leogao_emcom 2011-02-25  
引用

windowsservice是可以与桌面交互的。但是必须在service安装时添加与桌面交互选项


这句话应该修正为,在开发模式下,在为Service添加的ServiceProcessInstaller属性中的Account设置为LocalSystem,然后编译,使用installutil进行安装到windows Service编录(管理器),然后在对应的服务属性中【登录】页中,设置本地系统账户的【允许与桌面交互】选项被选中,最后启动服务,此时桌面就会显示出来。
7 楼 leogao_emcom 2011-02-25  
即使在安装时添加与桌面交互选项,也没有效果,已经试过了。
6 楼 wumingshi 2011-02-24  
这样的描述并不正确。windowsservice是可以与桌面交互的。但是必须在service安装时添加与桌面交互选项。或者手工在service的属性里修改。然后才有可能进行ui操作。当然楼主分离ui的思路是好的,因为没有ui的服务会降低内存消耗。
5 楼 leogao_emcom 2011-02-24  
public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
           
            Form ooo = new Form();
            ooo.Show();
        }

        protected override void OnStop()
        {

        }
    }
使用installutil安装一下,并且attach到debugger上,debug一下,窗体果然是不能跳出来显示的,即使是release模式build后,安装,start,也是不行的。我说的就是这样的情况
4 楼 leogao_emcom 2011-02-24  
杀毒软件也是间接的,用类似通信的办法绕过windows service这个限制的,而不是直接。
3 楼 leogao_emcom 2011-02-24  
引用

记得有一个方法, http://social.technet.microsoft.com/Forums/zh-CN/w7itproui/thread/9cdc0c96-42e1-4e6d-8f29-78077e87e7b2


这只是启动了另外一个进程,不在启动另外一个进程的情况下,能不能?
2 楼 ycaicainiao 2011-02-24  
<div class="quote_title">leogao_emcom 写道</div><div class="quote_div"><p>很多人这样设计Windows Service,希望在某种条件下,比如某个事件发生后,希望Windows Service弹出一个窗体!</p>
<p>其实这非常不正确,不管是C#,VB.net还是C++创建的Windows Service是被OS windows子系统调用的和维护的,</p>
<p>恰恰它没有桌面站,OS在启动Windows子系统的时候,会默认创建两类东西,就是有窗口站的桌面(其实也是一个窗口以及窗口树结构),另外一个就是无窗口站的环境,Windows Service恰恰运行在这个环境中,其含义是没有客户操作区的表面,那么即使你在Windows Service的OnStart方法中new一个Window对象并调用其Show方法,你也看不到有窗体弹出!</p>
<p> </p>
<p>但是你可以使用一个办法绕过这个限制,那就是使用Windows Service作为服务器端,做一个WCF/Remoting服务,</p>
<p>让一个独立进程(最好系统一起启动的)作为客户端,使用双向回调实现的观察者模式(可以使用委托实现,或者WCF就支持回调的方式,不过需要绑定也支持两个通道,并且回调的行为必须是OneWay的),服务在某个条件下通知被注册的客户端,此时客户端程序就可以有所动作,因为一个exe程序(Console等等)是在有窗口站的环境下运行的,那么它们在接收到服务器通知后就可以弹出一个可以看见的窗体了。</p>
<p> </p>
<p> </p>
<p> </p></div><br/>其实类似杀毒软件都是Windows Service,
明显都是可以直接使用UI的。
1 楼 ycaicainiao 2011-02-24  
<div class="quote_title">leogao_emcom 写道</div><div class="quote_div"><p>很多人这样设计Windows Service,希望在某种条件下,比如某个事件发生后,希望Windows Service弹出一个窗体!</p>
<p>其实这非常不正确,不管是C#,VB.net还是C++创建的Windows Service是被OS windows子系统调用的和维护的,</p>
<p>恰恰它没有桌面站,OS在启动Windows子系统的时候,会默认创建两类东西,就是有窗口站的桌面(其实也是一个窗口以及窗口树结构),另外一个就是无窗口站的环境,Windows Service恰恰运行在这个环境中,其含义是没有客户操作区的表面,那么即使你在Windows Service的OnStart方法中new一个Window对象并调用其Show方法,你也看不到有窗体弹出!</p>
<p> </p>
<p>但是你可以使用一个办法绕过这个限制,那就是使用Windows Service作为服务器端,做一个WCF/Remoting服务,</p>
<p>让一个独立进程(最好系统一起启动的)作为客户端,使用双向回调实现的观察者模式(可以使用委托实现,或者WCF就支持回调的方式,不过需要绑定也支持两个通道,并且回调的行为必须是OneWay的),服务在某个条件下通知被注册的客户端,此时客户端程序就可以有所动作,因为一个exe程序(Console等等)是在有窗口站的环境下运行的,那么它们在接收到服务器通知后就可以弹出一个可以看见的窗体了。</p>
<p> </p>
<p> </p>
<p> </p></div><br/>记得有一个方法,

http://social.technet.microsoft.com/Forums/zh-CN/w7itproui/thread/9cdc0c96-42e1-4e6d-8f29-78077e87e7b2

相关推荐

    WindowsService开发实例加说明

    **二、.NET Windows Service开发步骤** 1. **创建服务类**:在Visual Studio中新建项目,选择“Windows Service”模板。这会自动生成一个继承自`ServiceBase`的类,如`MyService.cs`。 2. **定义服务行为**:重写`...

    C#开发WindowsService程序源码加文档.pdf

    本资源"**C#开发WindowsService程序源码加文档.pdf**"聚焦于使用C#语言编写Windows服务的实践教程,包含源码与详细文档,对于想要深入理解和开发此类应用的开发者来说,是一份非常有价值的参考资料。 首先,我们来...

    C# Windows Service 开发示例程序

    通过这个“C# Windows Service 开发示例程序”,你将能够了解到如何创建、安装、启动、停止和管理一个简单的Windows Service,并为更复杂的系统集成和自动化任务打下基础。结合提供的视频教程,你可以更加深入地理解...

    一个WindowsService服务的编写实例

    在提供的压缩包文件"WindowsService1"中,可能包含了一个示例项目的源代码,展示了如何实现上述步骤。通过查看和学习这个项目,你可以更深入地理解Windows Service的创建过程,以及如何在实际应用中使用它们。记得在...

    C#创建Windows Service(Windows 服务)demo

    首先,我们需要创建一个新的C#项目,并选择“安装”类库模板,这将为我们生成一个基础的Windows Service结构。关键的类是`ServiceBase`,它是所有Windows服务的基类。你需要继承这个类并添加自定义逻辑。以下是一个...

    windows service开发的微信自动退款

    创建一个Windows Service主要涉及以下步骤: 1. **创建服务类**:继承自ServiceBase类,实现OnStart和OnStop方法,分别定义服务启动和停止时的逻辑。 2. **注册服务**:使用InstallUtil工具或代码方式将服务安装到...

    一个简单的基于C#实现的Windows Service 服务的程序例子代码

    在本文中,我们将深入探讨如何使用C#编程语言创建一个简单的Windows Service服务。Windows Service是一种在后台运行的应用程序,它们不依赖用户界面,通常用于执行周期性任务或提供系统级功能。C#提供了System....

    C#发现之旅 --- C#开发Windows Service程序)

    使用Visual Studio等集成开发环境(IDE),我们可以创建一个Windows Service项目,然后通过编写C#代码来实现服务的具体功能。 ### 开发Windows Service程序的步骤 开发Windows Service程序主要包含以下几个步骤: 1...

    windows service服务程序框架

    总的来说,学习和使用这个“Windows Service服务程序框架”项目,不仅可以帮助你掌握C++编写Windows Service的基础知识,还能加深对系统级编程和Windows API的理解。这将对你的系统管理和软件开发工作大有裨益。通过...

    Windows Service Wrapper 1.9

    **Windows Service Wrapper ...总之,Windows Service Wrapper 1.9 提供了一个轻量级且灵活的解决方案,将非服务应用程序轻松转换为Windows服务,这对于开发和运维人员来说,极大地简化了对后台应用程序的管理和监控。

    WindowsService为宿主程序的WCF示例代码

    - 创建一个Windows Service项目(如本示例中的WindowsService1)。 - 在服务类中,使用`System.ServiceProcess.ServiceBase`基类并重写其OnStart方法。 - 在OnStart方法中,实例化WCF ServiceHost,提供服务类型...

    windowsservice.pdf

    ServiceBase类是System.ServiceProcess命名空间中的一个关键类,它是所有Windows服务类的基类。ServiceBase类提供了与服务控制管理器通信所需的标准入口点,如OnStart和OnStop等方法。 #### 4. Windows服务编程 ...

    C# VS 2010 创建、安装、调试 windows服务(windows service)

    4. 打开命令提示符,使用管理员权限运行,然后输入`installutil.exe [服务可执行文件路径]`,例如`installutil.exe WindowsService1.exe`。 **调试Windows服务** 1. 右键点击服务项目,选择"属性"。 2. 在"启动动作...

    基于Qt的window service服务封装

    Qt是一个跨平台的应用程序开发框架,它支持多种操作系统,包括Windows。 标题"基于Qt的window service服务封装"指的是开发者使用Qt库对Windows Service进行了一次封装,使得在Qt环境中创建、控制和管理服务变得更加...

    Python编写Windows Service服务程序

    对于开发者来说,使用Python来开发Windows服务程序是一个不错的选择。然而,由于Python本身并不直接支持Windows服务,因此需要借助于第三方库`pywin32`来实现这一功能。本文将详细介绍如何使用Python结合`pywin32`来...

    C#Windows Service图文开发实例

    本实例将引导你创建一个简单的C# Windows服务,并介绍如何安装和配置该服务。 1. **创建Windows服务项目** 在Visual Studio 2010中,通过以下步骤创建一个新的Windows服务项目: - 打开Visual Studio,点击“文件...

    WindowsService安装包制作示范源码

    本示例是关于如何使用Visual Studio 2010(VS2010)创建一个Windows Service,并且封装成带有卸载功能的安装包,确保服务安装后能自动启动。 1. **创建Windows Service** - 打开VS2010,新建一个“Windows服务”...

    Visual Studio 2008开发WindowsService demo视频

    总的来说,"Visual Studio 2008开发Windows Service demo视频"将是一个宝贵的资源,它可以帮助开发者掌握创建后台服务的关键步骤,从而实现自动化任务、持久化的数据处理或其他需要在系统启动时运行的功能。...

    Windows service wrapper 2.1.2

    Windows服务包装器(Windows Service Wrapper)是一个实用工具,主要用于将任何可执行文件转换为Windows服务。这个工具在标题中提到的版本是2.1.2,它允许开发者或系统管理员轻松地将应用程序作为后台服务运行,即使...

Global site tag (gtag.js) - Google Analytics