求救!在windowService用Process.Start()启动程序没有界面

时间:2022-08-29 14:45:38
在windowService用Process.Start()启动程序没有界面 ,有没有解决的方法?
这个问题整了一个下午了都沒解决,在网上又沒有找到解决方法...
程序没问题,我在winForm里用Process.Start()就能打的开,
WinService也能打开,程序绑定的代码也能执行,就是不能显示界面.
求各位好人帮帮忙!

14 个解决方案

#1


没有,这是后台运行程序的必然结果。
你就是再找一年还是这个结果的。

#2


应该可以显示的,MessageBox就能显示,其它窗体理论也能显示 

#3


自己找到了方法了,而且不只一种- -!!
来点人回复吧,散分了

#4


晕,这样也行

#5


找到方法就贴一下地址或转帖一下答案。
没这需求,标记一下,你贴答案未来用时能来做参考:)

#6


引用 5 楼 wuyazhe 的回复:
找到方法就贴一下地址或转帖一下答案。
没这需求,标记一下,你贴答案未来用时能来做参考:)

#7


引用 5 楼 wuyazhe 的回复:
找到方法就贴一下地址或转帖一下答案。
没这需求,标记一下,你贴答案未来用时能来做参考:)


1.在服务程序安装时编程实现,ProjectInstaller.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
//using System.Linq;
using Microsoft.Win32; //对注册表操作一定要引用这个命名空间


namespace MonitorService
{
    [RunInstaller(true)]
    public partial class ProjectInstaller : Installer
    {
        public ProjectInstaller()
        {
            InitializeComponent();            
            //this.Context.Parameters["ServerCode"].ToString(); // 读取安装时输入的服务器编号           
        }

        private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
        {
            //设置允许服务与桌面交互
            SetServiceTable("MonitorService");            
        }
        /// <summary>
        /// 设置允许服务与桌面交互 ,修改了注册表,要重启系统才能生效
        /// </summary>
        /// <param name="ServiceName">服务程序名称</param>
        private void SetServiceTable(string ServiceName)
        {
            RegistryKey rk = Registry.LocalMachine;
            string key = @"SYSTEM\CurrentControlSet\Services\" + ServiceName;
            RegistryKey sub = rk.OpenSubKey(key, true);
            int value = (int)sub.GetValue("Type");
            sub.SetValue("Type", value | 256);
        }
    }
}

2.注册表修改

onstart的时候修改注册表   
   [HKEY_LOCAL_MACHINE"SYSTEM"CurrentControlSet"Services"你的服务名]   
   "Type"=dword:00000010   
   key    value+256   
   比如现在00000010是16+256=272   
   16精制就是00000110
 

3.SC程序修改, 允许与桌面进行交互

 在dos命令提示符下输入:
sc config MonitorService type= interact type= own

 回车即可。

可以用批处理的方式实现,把下面代码保存为 myservice.bat 即可:

 rem 配置服务程序为允许与桌面进行交互方式
@echo "准备停止服务程序..."
sc stop MyService
@echo "设置允许与桌面进行交互方式允许"
sc config MyService type= interact type= own
@echo "正在重新启动服务..."
sc start MyService
@echo "启动服务成功!"

取消“允许与桌面进行交互”

DOS命令提示符下运行下面语句即可:

 sc config MyService type= own

经测试:1,2 可以选中“允许与桌面进行交互”,但启动服务的时候,不能弹出应用程序的界面。

           3 可以完美实现所有要求。

#8


方法一二要重启计算机

#9


插入日志查看把

#10


怎么多高手都不知道,只能说明..

哈哈,告诉你一个很弯的方法,做一个隐藏在任务的windows程序,然后用某种通信方式,让你的windowService发出一个消息给这个程序,具体用什么通信方式,你自己看吧,收到消息后用,这个win程序再用Process.Start()的方法运行你要的程序,搞定...

方法很多很多...为何总纠结在一个地方

#11


To 10#:
既然他已经搜到答案了。不妨公布,如果每个人发帖后,说我找到答案了。然后结贴了事,版主来给擦屁股,不是很累的事情么?找到答案来贴出答案,方便日后搜索是一个好习惯,所以,我和oj不帖答案,才是对版块风气有益。

#12


补充:
不过你提出的方法也是可以的。:) 讨论是很好的。

#13


求救!在windowService用Process.Start()启动程序没有界面求救!在windowService用Process.Start()启动程序没有界面

#14


感谢楼主,我也遇到了一样的问题,你的帖子帮助了我。

#1


没有,这是后台运行程序的必然结果。
你就是再找一年还是这个结果的。

#2


应该可以显示的,MessageBox就能显示,其它窗体理论也能显示 

#3


自己找到了方法了,而且不只一种- -!!
来点人回复吧,散分了

#4


晕,这样也行

#5


找到方法就贴一下地址或转帖一下答案。
没这需求,标记一下,你贴答案未来用时能来做参考:)

#6


引用 5 楼 wuyazhe 的回复:
找到方法就贴一下地址或转帖一下答案。
没这需求,标记一下,你贴答案未来用时能来做参考:)

#7


引用 5 楼 wuyazhe 的回复:
找到方法就贴一下地址或转帖一下答案。
没这需求,标记一下,你贴答案未来用时能来做参考:)


1.在服务程序安装时编程实现,ProjectInstaller.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
//using System.Linq;
using Microsoft.Win32; //对注册表操作一定要引用这个命名空间


namespace MonitorService
{
    [RunInstaller(true)]
    public partial class ProjectInstaller : Installer
    {
        public ProjectInstaller()
        {
            InitializeComponent();            
            //this.Context.Parameters["ServerCode"].ToString(); // 读取安装时输入的服务器编号           
        }

        private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
        {
            //设置允许服务与桌面交互
            SetServiceTable("MonitorService");            
        }
        /// <summary>
        /// 设置允许服务与桌面交互 ,修改了注册表,要重启系统才能生效
        /// </summary>
        /// <param name="ServiceName">服务程序名称</param>
        private void SetServiceTable(string ServiceName)
        {
            RegistryKey rk = Registry.LocalMachine;
            string key = @"SYSTEM\CurrentControlSet\Services\" + ServiceName;
            RegistryKey sub = rk.OpenSubKey(key, true);
            int value = (int)sub.GetValue("Type");
            sub.SetValue("Type", value | 256);
        }
    }
}

2.注册表修改

onstart的时候修改注册表   
   [HKEY_LOCAL_MACHINE"SYSTEM"CurrentControlSet"Services"你的服务名]   
   "Type"=dword:00000010   
   key    value+256   
   比如现在00000010是16+256=272   
   16精制就是00000110
 

3.SC程序修改, 允许与桌面进行交互

 在dos命令提示符下输入:
sc config MonitorService type= interact type= own

 回车即可。

可以用批处理的方式实现,把下面代码保存为 myservice.bat 即可:

 rem 配置服务程序为允许与桌面进行交互方式
@echo "准备停止服务程序..."
sc stop MyService
@echo "设置允许与桌面进行交互方式允许"
sc config MyService type= interact type= own
@echo "正在重新启动服务..."
sc start MyService
@echo "启动服务成功!"

取消“允许与桌面进行交互”

DOS命令提示符下运行下面语句即可:

 sc config MyService type= own

经测试:1,2 可以选中“允许与桌面进行交互”,但启动服务的时候,不能弹出应用程序的界面。

           3 可以完美实现所有要求。

#8


方法一二要重启计算机

#9


插入日志查看把

#10


怎么多高手都不知道,只能说明..

哈哈,告诉你一个很弯的方法,做一个隐藏在任务的windows程序,然后用某种通信方式,让你的windowService发出一个消息给这个程序,具体用什么通信方式,你自己看吧,收到消息后用,这个win程序再用Process.Start()的方法运行你要的程序,搞定...

方法很多很多...为何总纠结在一个地方

#11


To 10#:
既然他已经搜到答案了。不妨公布,如果每个人发帖后,说我找到答案了。然后结贴了事,版主来给擦屁股,不是很累的事情么?找到答案来贴出答案,方便日后搜索是一个好习惯,所以,我和oj不帖答案,才是对版块风气有益。

#12


补充:
不过你提出的方法也是可以的。:) 讨论是很好的。

#13


求救!在windowService用Process.Start()启动程序没有界面求救!在windowService用Process.Start()启动程序没有界面

#14


感谢楼主,我也遇到了一样的问题,你的帖子帮助了我。