我在 c# 里面做了一个 Form 应用 TestForm, 这个 TestForm 在启动时会最小化到右下角,并显示一个托盘图标。
这个 TestForm 在编绎成功后,直接比击 TestForm.exe 就可以直接在右下角显示托盘图标并弹出一个小提示。
我现在做了另一个 Windows Service 的应用,在 Windows Service 应用里面就是要启动这个 TestForm.
但是,发现用以下程序是可以启动到 TestForm, 但是并不能在右下角显示出托盘图标并弹出一个小提示:
string testForm = Path.Combine(assemblyFolder, "TestForm.exe");
System.Diagnostics.Process[] testFormProcesses = System.Diagnostics.Process.GetProcessesByName("TestForm");
if (testFormProcesses == null || testFormProcesses.Length == 0)
{
Process process = System.Diagnostics.Process.Start(testForm);
Process proc = new Process();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = false;
//proc.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
proc.StartInfo.FileName = testForm;
//proc.StartInfo.RedirectStandardError = false;
//proc.StartInfo.RedirectStandardOutput = false;
proc.Start();
//这里面可以见到 TestForm.exe 运行但没有右下角的托盘图标。
//但是,如果不使用 Process 来启动,而是直接手工在 Windows 上双击 TestForm.exe 就可以直接在右下角显示托盘图标并弹出一个小提示
}
上面的参数我试过改了也没用。
请帮下忙,谢谢。
8 个解决方案
#1
估计和程序路径有关。图标从外部文件加载,没有正确处理相对路径。
#2
是什么意思?
为什么我双击又可以显示托盘图标?
另外,那个 TestForm.exe 运行后,会在后台当成一个服务接收一些事件,我从 TestForm.exe 生成的日志可以看到,当 TestForm.exe 被运行后,不管是用双击或者是用 Process 启动,那些日志都是正常在后台运行。
是不是因为我第二个是 Windows Service (Windows 服务)的应用,所以,在 Windows Service 里面不能显示 Form 界面吗???
可否给个解决方法?因为现在需要从Windows Service 服务程序里面启动有界面的 TestForm.exe
#3
需要注意,两个问题,,,
第一:从Vista开始,服务与用户进程运行在不同的会话中,你这种方法从服务中启动TestForm程序,则该程序运行在会话0,而那个会话你是看不到的。所以你看不到UI。
第二:启动程序时,子进程会继承父进程的环境变量,包括当前工作目录等一些信息。你需要使用ProcessStartInfo ,设置里面的WorkingDirectory,以防止有些程序考虑不周到,无法正常加载数据。
第一:从Vista开始,服务与用户进程运行在不同的会话中,你这种方法从服务中启动TestForm程序,则该程序运行在会话0,而那个会话你是看不到的。所以你看不到UI。
第二:启动程序时,子进程会继承父进程的环境变量,包括当前工作目录等一些信息。你需要使用ProcessStartInfo ,设置里面的WorkingDirectory,以防止有些程序考虑不周到,无法正常加载数据。
#4
谢谢。
#5
你在电脑上新建一个用户,用户1开启程序,切换到用户2,也是看不到的.
服务启动的程序,正常登陆用户都看不到
服务启动的程序,正常登陆用户都看不到
#6
不过应该有办法能够让服务启动程序的时候按某个用户来启动
AB_PLC的OPC:RSLINX软件,就是后台运行一个服务,当有OPC访问的时候,启动客户端程序显示.
不过C#能否实现就不知道了.那个目测是JAVA的.
AB_PLC的OPC:RSLINX软件,就是后台运行一个服务,当有OPC访问的时候,启动客户端程序显示.
不过C#能否实现就不知道了.那个目测是JAVA的.
#7
你启动一个程序需要费那么大的劲么?一句代码搞定。
Process.Start("程序路径");
#8
你不会用
ShellExecuteA or CateProcess?
ShellExecuteA or CateProcess?
#1
估计和程序路径有关。图标从外部文件加载,没有正确处理相对路径。
#2
是什么意思?
为什么我双击又可以显示托盘图标?
另外,那个 TestForm.exe 运行后,会在后台当成一个服务接收一些事件,我从 TestForm.exe 生成的日志可以看到,当 TestForm.exe 被运行后,不管是用双击或者是用 Process 启动,那些日志都是正常在后台运行。
是不是因为我第二个是 Windows Service (Windows 服务)的应用,所以,在 Windows Service 里面不能显示 Form 界面吗???
可否给个解决方法?因为现在需要从Windows Service 服务程序里面启动有界面的 TestForm.exe
#3
需要注意,两个问题,,,
第一:从Vista开始,服务与用户进程运行在不同的会话中,你这种方法从服务中启动TestForm程序,则该程序运行在会话0,而那个会话你是看不到的。所以你看不到UI。
第二:启动程序时,子进程会继承父进程的环境变量,包括当前工作目录等一些信息。你需要使用ProcessStartInfo ,设置里面的WorkingDirectory,以防止有些程序考虑不周到,无法正常加载数据。
第一:从Vista开始,服务与用户进程运行在不同的会话中,你这种方法从服务中启动TestForm程序,则该程序运行在会话0,而那个会话你是看不到的。所以你看不到UI。
第二:启动程序时,子进程会继承父进程的环境变量,包括当前工作目录等一些信息。你需要使用ProcessStartInfo ,设置里面的WorkingDirectory,以防止有些程序考虑不周到,无法正常加载数据。
#4
谢谢。
#5
你在电脑上新建一个用户,用户1开启程序,切换到用户2,也是看不到的.
服务启动的程序,正常登陆用户都看不到
服务启动的程序,正常登陆用户都看不到
#6
不过应该有办法能够让服务启动程序的时候按某个用户来启动
AB_PLC的OPC:RSLINX软件,就是后台运行一个服务,当有OPC访问的时候,启动客户端程序显示.
不过C#能否实现就不知道了.那个目测是JAVA的.
AB_PLC的OPC:RSLINX软件,就是后台运行一个服务,当有OPC访问的时候,启动客户端程序显示.
不过C#能否实现就不知道了.那个目测是JAVA的.
#7
你启动一个程序需要费那么大的劲么?一句代码搞定。
Process.Start("程序路径");
#8
你不会用
ShellExecuteA or CateProcess?
ShellExecuteA or CateProcess?