我自己做了一个系统服务,在开机后自动启动,能不能启动成功与否都会有一个代表服务的图标显示在任务栏上,还可以有快捷菜单,比如“开启服务”、“停止服务”。

解决方案 »

  1.   

    在你的服务里增加一个winForm窗体,然后拖入一个 NotifyIcon 控件。你还可以设置其动态改变图标,处理单机和双击事件并显示快捷菜单等。
      

  2.   

    可是,我不明白怎么在服务启动以后再启动这个winform窗体应用程序.  AutoSendTimer.Start();//服务启动成功--- Form1 f = new Form1(); f.Show();--这样肯定不对。但是在
     static void Main()
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] 

    new ServiceTest() 
    };
                ServiceBase.Run(ServicesToRun);        }里该怎么写,我试了好几个语句都不对,请教大家,谢谢
      

  3.   


    这是对的。不过需要在写一行 f.Hide();只要执行了这三行代码,托盘就已经出现了。
      

  4.   


    这是什么意思?要启动什么“窗体应用程序”?在你的服务程序中增加winform窗口,而不是什么另外的程序。
      

  5.   

    我确实是在我的服务程序中添加的winform窗口。您说的这个问题已经解决了,但是托盘没有出现。..
      

  6.   

    程序也执行了notifyIcon1.Icon=icohui;notifyIcon1.Text = ServiceName;
                notifyIcon1.Visible = true;但是就是不出现呢
      

  7.   


    看看你ICO 的文件是已什么方式加入到程序中的 资源文件?
    还是什么 确保文件正确
      

  8.   

    ICO文件是正确的,是从这个服务所在文件夹里导入到程序里,然后加进去的
      

  9.   

    等待楼主解决之后把方法也给我说一下呀,我最近也遇到同样样样的问题,就是不出那个icon
      

  10.   

    好的,但是现在还没出来。你的是跟服务有关的吗,还是单纯的一个程序出不来ICon呢?
      

  11.   

    protected override void OnStart(string[] args)
    {
    ----{服务启动成功;}Form1 f = new Form1(); f.Show(); f.Hide();
    }
    这样就显示出ICON了,一开始把那三句话放在了if {}
    else{//启动成功,放在这个后面就不对了},放在最外面就对了.但是ICOn的那些右键快捷方式用不了》,希望大家继续关注
      

  12.   

    服务里启动一个 winform.exe 当然这个service 必须是 allow service interact with desktop (允许服务与桌面交互)
    然后可以用bat(net start、net stop)控制服务的启动,停止下面的代码可以让你在安装时将此选项勾选上:
    【在 ProjectInstaller 里重写了 Commit 方法】public override void Commit(IDictionary savedState)  
    {  
        // set the service "allow service interact with desktop" as "true"  
        // e.g. service can run "cmd.exe"  
        var coOptions = new ConnectionOptions {Impersonation = ImpersonationLevel.Impersonate};  
        var mgmtScope = new ManagementScope(@"root\CIMV2", coOptions);  
        mgmtScope.Connect();  
        var wmiService = new ManagementObject("Win32_Service.Name='" + serviceInstaller1.ServiceName + "'");  
        var inputParams = wmiService.GetMethodParameters("Change");  
        inputParams["DesktopInteract"] = true;  
        var outParams = wmiService.InvokeMethod("Change", inputParams, null);  
      
        base.Commit(savedState);  
    }  
     
      

  13.   

    谢谢fangxinggood,真的可以了,可是我的notifyIcon1绑定上了contextMenuStrip1,怎么右击时不出现快捷菜单呢,而且form里面的timer也不执行tick事件,是不是还需要设置什么呢?
      

  14.   

    这个就是你winform应用里的问题了。只要启动了,它和service就没有关系了。
      

  15.   

    鼠标移到ICOn上有显示信息,为什么右键单击就弹不出快捷菜单呢?...................
      

  16.   

    鼠标移到ICOn上有显示信息,为什么右键单击就弹不出快捷菜单呢?...................
      

  17.   

    从服务中直接访问UI资源其实会感觉怪怪的,不如分开两个进程吧。一个是服务进程,另一个是UI进程。UI进程可以监视服务进程的状况,从而对服务进行控制,同时也可以采用某种协议与服务进程通讯,以实现一些特殊的功能需求。UI进程没有业务逻辑,只负责与用户交互,类型于B/S模式中的浏览器。
      

  18.   

    如果在Program.cs文件里Main函数下启动Form1的话,而不是启动服务,iCOn右键快捷方式就能出来,但是单击重启服务,就启动不起来服务,启动服务的代码是:ServiceController1.Start();谁能帮个忙啊
      

  19.   

    winserver和你的托盘winform是两个独立的东东。winform只是调了系统命令对服务进行简单的启动停止等等。所以你的winform完全可以加在启动项里就完了。
      

  20.   


    两个进程可是两个EXE分别运行,一个是服务,一个是UI;或者是同一个EXE运行两次,根据启动参数来区别是作为服务还是UI。
      

  21.   

    我需要电脑启动后,先运行服务的程序,再运行UI的程序。这样的话是在打包的时候里设置呢,还是有其他办法呢?现在他们都能自动运行,ui的程序是加载到系统启动项了,服务是设置的自动启动,每次电脑启动起来后都是ui先运行,这样就会弹出提示框“无法手动启动服务,需要installutil。什么的”具体提示忘记了