• windows service 与GUI窗口的实现


    以前做过几次windows service,但都是没有界面的,想配置参数都只能使用文本文件,然后重启服务才行,而且不能查看服务的运行状态。
    最近在网上找到一些文章,终于找到可以启动服务时有界面的方法。
    首先服务工程中本身不能有窗体,这是WINDOWS系统本身不支持的。因此必须要有两个工程才能实现,一是服务程序,另一个是GUI程序。
    当服务程序启动时通过代码启动GUI程序,从而实现自动启动GUI程序,并且有界面展示。为了能让服务程序能与GUI程序通信,可以在服务程序中建立一个TCP server,
    GUI程序中建立一个tcp client,这样两个程序之间即可实现通信。
    要使服务程序能打开GUI程序,并在窗口中显示出来,必须在安装服务之后设置其启动帐号为”本地系统帐号“且“允许与桌面交互”。
    而”本地系统帐号“这项可以在服务程序开发时设置,而“允许与桌面交互”必须要使用另外的途径实现,请参考下面的代码。

    具体步骤:
    先建立一个WINFORM 程序。
    然后再建立一个windows service project. (具体操作不在此说明)。
    在serviceInstaller1_Committed事件中添加如下代码:

     ConnectionOptions coOptions = new ConnectionOptions();
                coOptions.Impersonation = ImpersonationLevel.Impersonate;
                ManagementScope mgmtScope = new System.Management.ManagementScope(@"root\CIMV2", coOptions);

                mgmtScope.Connect();
                ManagementObject wmiService;
                wmiService = new ManagementObject("Win32_Service.Name='" + serviceInstaller1.ServiceName + "'");

                ManagementBaseObject InParam = wmiService.GetMethodParameters("Change");

                InParam["DesktopInteract"] = true;

                ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", InParam, null);
    此段代码即是将此Service设置为“允许与桌面交互”,有了此选项之后,服务启动时GUI程序的界面将会出现。

    编译之后,将gui程序放在合适的位置,安装服务,并设置为自启动服务,针对windows2000/xp系统,启动服务时将会出现GUI程序的界面,如果调用没有出错的话。

    要注意的是在windows 2003上启动服务时界面可能不会出现(虽然在服务管理器中“允许与桌面交互”已经勾上),但程序已经在运行(通过任务管理器查看)。
    有两个解决办法,一是重启机器;二是在“服务管理器”中手工重新设置一下“允许与桌面交互”,然后确定,此时再启动服务即可(其实未做任何修改,搞不懂MS的东西为什么会这样,跟踪了注册表,也没看到有变化)。

    使用双进程实现服务和GUI的好处是,可以随时查看服务的状态,并且GUI程序当掉之后,服务程序可以自动将其启动,有点象木马了。

    参考地址:
    双进程实现示例,只是用的是VC++,难度有点大,可以直接使用其XLogOff.exe服务程序,只是需要把里面的XLGUI替换为你的GUI程序。当然,最好的方法是参考这个服务用C#重写,应该比较容易的。
    http://www.codeproject.com/useritems/xlogoff.asp
    中国人自己做的,将任何程序做成服务启动程序的工具:
    http://www.codeproject.com/system/xyntservice.asp
    另一个讲述如何自动设置“允许与桌面交互”选项的,未成功,不知重启之后是否有效。
    http://www.codeproject.com/csharp/CsWindowsServiceDesktop.asp
    另一篇说明如何设置“允许与桌面交互”选项的
    http://www.dotnet247.com/247reference/msgs/36/184247.aspx

  • 相关阅读:
    Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) C. Success Rate
    Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) B. T-Shirt Hunt
    go 读取数据库所有表数据显示到网页(便于测试时看)
    go 文件上传
    go 文件服务(读取须权限)
    vps git无法clone DNS解析错误
    go 自己封的postgresql连接池操作包
    看 迪杰斯特拉(Dijsktra)算法体会
    Floyd算法(弗洛伊德算法) 百度百科
    Constructing Roads In JGShining's Kingdom
  • 原文地址:https://www.cnblogs.com/margiex/p/340277.html
Copyright © 2020-2023  润新知