我用c#写了一个系统服务,这个服务只用于打开一个普通的可执行文件,比
如“c:\windows\notepad.exe“。在vs环境中测试时很正常,编译后这个服务也可以正常
启动和停止,但是它打开的可执行文件(比如notepad.exe)却不显示界面,在任务管理
器中可以看到notepad.exe的进程,用户名是system。而我用这个服务来打开的程序是必
须要显示界面的,应该如何解决这个问题?
有没有别的方法我需要检测某个exe程序时候处于运行状态?如果没运行则打开程序。谢谢各位大侠
如果要打开界面,就不要以服务形式运行,服务可以在你不登录的情况下就运行,那时根本就没有桌面,想想这个就知道原因了。建议你把你那个服务进程做成一个普通进程,放到启动菜单或者注册表的启动项里面去。
一般并不推荐这样做,不过可以尝试把服务属性里面的“允许与桌面交互”勾上,应该就可以了
允许与桌面交互是指后台运行的服务程序可以弹出对话框之类的与用户交互.一般情况下,后台服务程序使用系统帐号或其它指定的帐号运行,并不使用当前登陆的用户名与密码运行(这也就是为什么服务可以在启动后就运行而不管用户是否登陆),当勾选此选项后,将可以与当前登陆的用户交互. |
用界面来控制服务是没有问题的,可以参考:
制作可控制界面的windows服务(windows service)
http://www.cnblogs.com/downmoon/archive/2009/11/05/1596751.html
楼主要实现的是服务控制界面的显示。只要合适的参数应该可以。前提是:
设置:服务属性里面的“允许与桌面交互”,可以在Installer.AfterInstall 事件中添加你的代码
http://msdn.microsoft.com/zh-cn/library/system.configuration.install.installer.afterinstall%28VS.80%29.aspx
可以看这里:
http://www.cnblogs.com/chenzhigao/archive/2010/02/06/1665173.html
用服务去打开一个UI程序,是不可能的,服务后台的进程所使用的用户是system,这个用户是不需要UI的,因此也就限制了打开有UI线程的应用。因此,你要打开一个UI线程,必须使用一个管理员权限的账号去打开程序,默认一个程序去打开另一个程序,后一个程序其使用的win账号是前一个程序的win账号。
参考下这个:
http://www.cnblogs.com/luxilin/p/3347212.html