C# 用 Process 启动的程序不能成功显示托盘图标(在右下角),但双击却可以

时间:2021-02-23 18:01:20
Hi,

我在 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


引用 1 楼 caozhy 的回复:
估计和程序路径有关。图标从外部文件加载,没有正确处理相对路径。


是什么意思?

为什么我双击又可以显示托盘图标?

另外,那个 TestForm.exe 运行后,会在后台当成一个服务接收一些事件,我从 TestForm.exe 生成的日志可以看到,当 TestForm.exe 被运行后,不管是用双击或者是用 Process 启动,那些日志都是正常在后台运行。

是不是因为我第二个是 Windows Service (Windows 服务)的应用,所以,在 Windows Service 里面不能显示 Form 界面吗???

可否给个解决方法?因为现在需要从Windows Service 服务程序里面启动有界面的 TestForm.exe 

#3


需要注意,两个问题,,,
第一:从Vista开始,服务与用户进程运行在不同的会话中,你这种方法从服务中启动TestForm程序,则该程序运行在会话0,而那个会话你是看不到的。所以你看不到UI。

第二:启动程序时,子进程会继承父进程的环境变量,包括当前工作目录等一些信息。你需要使用ProcessStartInfo ,设置里面的WorkingDirectory,以防止有些程序考虑不周到,无法正常加载数据。

#4


引用 3 楼 LargeSkyMensk 的回复:
需要注意,两个问题,,,
第一:从Vista开始,服务与用户进程运行在不同的会话中,你这种方法从服务中启动TestForm程序,则该程序运行在会话0,而那个会话你是看不到的。所以你看不到UI。

第二:启动程序时,子进程会继承父进程的环境变量,包括当前工作目录等一些信息。你需要使用ProcessStartInfo ,设置里面的WorkingDirectory,以防止有些程序考虑不周到,无法正常加载数据。


谢谢。

#5


你在电脑上新建一个用户,用户1开启程序,切换到用户2,也是看不到的.
服务启动的程序,正常登陆用户都看不到

#6


不过应该有办法能够让服务启动程序的时候按某个用户来启动
AB_PLC的OPC:RSLINX软件,就是后台运行一个服务,当有OPC访问的时候,启动客户端程序显示.
不过C#能否实现就不知道了.那个目测是JAVA的.

#7


你启动一个程序需要费那么大的劲么?一句代码搞定。

Process.Start("程序路径");

#8


你不会用
ShellExecuteA or CateProcess?

#1


估计和程序路径有关。图标从外部文件加载,没有正确处理相对路径。

#2


引用 1 楼 caozhy 的回复:
估计和程序路径有关。图标从外部文件加载,没有正确处理相对路径。


是什么意思?

为什么我双击又可以显示托盘图标?

另外,那个 TestForm.exe 运行后,会在后台当成一个服务接收一些事件,我从 TestForm.exe 生成的日志可以看到,当 TestForm.exe 被运行后,不管是用双击或者是用 Process 启动,那些日志都是正常在后台运行。

是不是因为我第二个是 Windows Service (Windows 服务)的应用,所以,在 Windows Service 里面不能显示 Form 界面吗???

可否给个解决方法?因为现在需要从Windows Service 服务程序里面启动有界面的 TestForm.exe 

#3


需要注意,两个问题,,,
第一:从Vista开始,服务与用户进程运行在不同的会话中,你这种方法从服务中启动TestForm程序,则该程序运行在会话0,而那个会话你是看不到的。所以你看不到UI。

第二:启动程序时,子进程会继承父进程的环境变量,包括当前工作目录等一些信息。你需要使用ProcessStartInfo ,设置里面的WorkingDirectory,以防止有些程序考虑不周到,无法正常加载数据。

#4


引用 3 楼 LargeSkyMensk 的回复:
需要注意,两个问题,,,
第一:从Vista开始,服务与用户进程运行在不同的会话中,你这种方法从服务中启动TestForm程序,则该程序运行在会话0,而那个会话你是看不到的。所以你看不到UI。

第二:启动程序时,子进程会继承父进程的环境变量,包括当前工作目录等一些信息。你需要使用ProcessStartInfo ,设置里面的WorkingDirectory,以防止有些程序考虑不周到,无法正常加载数据。


谢谢。

#5


你在电脑上新建一个用户,用户1开启程序,切换到用户2,也是看不到的.
服务启动的程序,正常登陆用户都看不到

#6


不过应该有办法能够让服务启动程序的时候按某个用户来启动
AB_PLC的OPC:RSLINX软件,就是后台运行一个服务,当有OPC访问的时候,启动客户端程序显示.
不过C#能否实现就不知道了.那个目测是JAVA的.

#7


你启动一个程序需要费那么大的劲么?一句代码搞定。

Process.Start("程序路径");

#8


你不会用
ShellExecuteA or CateProcess?