You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Process类启动.exe文件仅进程运行但程序未打开的问题求助

问题:启动EXE文件仅显示进程但无窗口打开

我最近遇到个头疼的问题:用C#写的程序点击按钮启动任意EXE文件时,任务管理器里能看到这个进程在跑,但就是看不到程序窗口弹出来,就像卡在启动状态一样。我用到的代码如下:

private void Button1_Click(object sender, EventArgs e) {
    Process process = new Process();
    process.StartInfo.FileName = DosyaYolu;
    process.Start();
}
private void button2_Click(object sender, EventArgs e) {
    OpenFileDialog file = new OpenFileDialog();
    file.Filter = "Exe files (*.exe)|*.exe|All files (*.*)|*.*";
    file.FilterIndex = 1;
    file.RestoreDirectory = true;
    file.CheckFileExists = false;
    file.Title = "Exe Dosyası Seçiniz..";
    if (file.ShowDialog() == DialogResult.OK) {
        // dosya seçildi ise
        DosyaYolu = file.FileName;
        DosyaAdi = file.SafeFileName;
    }
    label1.Text = DosyaYolu;
}

排查&解决思路

我之前碰到过类似的情况,大概率是这几个原因导致的,你可以挨个试试:

  • 工作目录不匹配:很多EXE程序依赖自身所在目录下的配置文件、资源文件,而默认启动进程时,工作目录是你的C#程序的运行目录,不是目标EXE的目录。这时候程序找不到依赖,就会默默在后台跑但不弹出窗口。
    解决方法很简单,给进程设置正确的工作目录:

    private void Button1_Click(object sender, EventArgs e) {
        Process process = new Process();
        process.StartInfo.FileName = DosyaYolu;
        // 设置工作目录为目标EXE所在的文件夹
        process.StartInfo.WorkingDirectory = Path.GetDirectoryName(DosyaYolu);
        process.Start();
    }
    

    注意要先在代码顶部添加using System.IO;引用哦。

  • OpenFileDialog的安全隐患:你设置了CheckFileExists = false,这意味着用户可能选到一个不存在的文件,但进程还是会被创建(可能是个无效的空进程)。建议把这个属性改成true,避免选到无效文件:

    file.CheckFileExists = true;
    
  • 权限不足:如果目标EXE需要管理员权限才能运行,而你的C#程序没有以管理员身份启动,那进程可能会被系统静默限制,无法弹出窗口。这时候可以给你的程序添加管理员权限请求:

    1. 在项目里添加app.manifest文件(如果没有的话)
    2. 找到<requestedExecutionLevel>节点,改成:
      <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      
  • 捕获启动异常:有时候进程启动失败但没有提示,你可以加个异常捕获,看看具体报错信息:

    private void Button1_Click(object sender, EventArgs e) {
        try {
            Process process = new Process();
            process.StartInfo.FileName = DosyaYolu;
            process.StartInfo.WorkingDirectory = Path.GetDirectoryName(DosyaYolu);
            process.Start();
        } catch (Exception ex) {
            MessageBox.Show("启动失败:" + ex.Message);
        }
    }
    

如果是控制台程序的话,还可以尝试设置StartInfo.UseShellExecute = false并重定向输出,看看程序有没有输出错误信息,不过GUI程序一般不需要这个。

内容的提问来源于stack exchange,提问作者Ozcan

火山引擎 最新活动