关于winforms:如何查找使用c#运行的进程?

关于winforms:如何查找使用c#运行的进程?

How do I find out if a process is already running using c#?

我有C#winforms应用程序,该应用程序需要不时启动一个外部exe,但是我不希望启动另一个进程(如果已经在运行),而是切换到该进程。

那么在下面的示例中,如何在C#中做到这一点?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System.Diagnostics;

...

Process foo = new Process();

foo.StartInfo.FileName = @"C:\\bar\\foo.exe";
foo.StartInfo.Arguments ="Username Password";

bool isRunning = //TODO: Check to see if process foo.exe is already running


if (isRunning)
{
   //TODO: Switch to foo.exe process
}
else
{
   foo.Start();
}

这应该为您做。

检查流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//Namespaces we need to use
using System.Diagnostics;

public bool IsProcessOpen(string name)
{
    //here we're going to get a list of all running processes on
    //the computer
    foreach (Process clsProcess in Process.GetProcesses()) {
        //now we're going to see if any of the running processes
        //match the currently running processes. Be sure to not
        //add the .exe to the name you provide, i.e: NOTEPAD,
        //not NOTEPAD.EXE or false is always returned even if
        //notepad is running.
        //Remember, if you have the process running more than once,
        //say IE open 4 times the loop thr way it is now will close all 4,
        //if you want it to just close the first one it finds
        //then add a return; after the Kill
        if (clsProcess.ProcessName.Contains(name))
        {
            //if the process is found to be running then we
            //return a true
            return true;
        }
    }
    //otherwise we return a false
    return false;
}

</wyn>

您也可以使用LINQ,

1
var processExists = Process.GetProcesses().Any(p => p.ProcessName.Contains("<your process name>"));

我已经在VB运行时中使用AppActivate函数来激活现有进程。
您将必须将Microsoft.VisualBasic dll导入C#项目。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
using System.Diagnostics;
using Microsoft.VisualBasic;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            Process[] proc = Process.GetProcessesByName("notepad");
            Interaction.AppActivate(proc[0].MainWindowTitle);
        }
    }
}


您可以简单地使用Process.GetProcesses方法枚举进程。


我发现Mutex不能像在Console应用程序中那样工作。因此,使用WMI查询可以在"任务管理器"窗口中看到的进程将解决您的问题。

使用这样的东西:

1
2
3
4
5
6
7
8
9
10
11
static bool isStillRunning() {
   string processName = Process.GetCurrentProcess().MainModule.ModuleName;
   ManagementObjectSearcher mos = new ManagementObjectSearcher();
   mos.Query.QueryString = @"SELECT * FROM Win32_Process WHERE Name = '" + processName + @"'";
   if (mos.Get().Count > 1)
   {
        return true;
    }
    else
        return false;
}

注意:添加程序集引用" System.Management"以启用类型的智能。


请记住两个注意事项:

  • 您的示例涉及放置一个
    命令行上的密码。那
    明文表示一个秘密
    可能是一个安全漏洞。

  • 枚举过程时,询问
    自己真正处理你
    想列举一下。所有用户,或
    只是当前用户?如果
    当前用户已登录两次(两次
    桌面)?


  • 在过去的项目中,我需要阻止一个进程的多次执行,因此我在该进程的init部分中添加了一些代码,以创建一个命名的互斥体。在继续其余过程之前,已创建并获取了此文本。如果该进程可以创建并获取互斥锁,则它是第一个运行的互斥锁。如果另一个进程已经控制了互斥锁,那么失败的不是第一个,因此它会立即退出。

    由于对特定硬件接口的依赖性,我只是试图阻止第二个实例运行。根据"切换到"行的需要,您可能需要更具体的解决方案,例如进程ID或句柄。

    另外,我可以访问试图启动的过程的源代码。如果您无法修改代码,则添加互斥锁显然不是一种选择。


    我认为要完全解决您的问题,需要了解您的应用程序确定foo.exe实例已在运行时发生的情况,即" // TODO:切换到foo.exe进程"的实际含义是什么?


    Mnebuerquo wrote:

    Also, I had source code access to the
    process I was trying to start. If you
    can not modify the code, adding the
    mutex is obviously not an option.

    我没有源代码可以访问要运行的进程。

    一旦发现进程已在运行,我就结束了使用过程MainWindowHandle切换到该进程:

    1
    2
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
     public static extern bool SetForegroundWindow(IntPtr hWnd);

    推荐阅读

      linux退出启动命令行?

      linux退出启动命令行?,系统,状态,档案,平台,命令,环境,模式,终端,程序,编辑,l

      linux进程运行命令?

      linux进程运行命令?,系统,工作,状态,地址,信息,进程,基础,命令,管理,软件,lin

      进程管理linux命令?

      进程管理linux命令?,系统,管理,地址,状态,情况,简介,工具,网络,分析,软件,lin

      linux中启动服务命令?

      linux中启动服务命令?,服务,系统,命令,信息,工作,设备,网络,标准,名称,密码,l

      linux显示运行命令?

      linux显示运行命令?,系统,服务,状态,信息,工具,数据,电脑,标准,管理,时间,如

      linux运行vim命令?

      linux运行vim命令?,系统,工具,官方网站,模式,基础,数据,代码,环境,入口,命令

      linux永久启动命令?

      linux永久启动命令?,系统,服务,密码,软件,工具,电脑,位置,环境,状态,发行,lin

      linux命令行启动软件?

      linux命令行启动软件?,系统,工具,软件,位置,密码,电脑,首页,代码,环境,地方,l

      linux下看进程命令行?

      linux下看进程命令行?,系统,情况,软件,服务,状态,名称,环境,进程,命令,数据,

      linux监控命令运行?

      linux监控命令运行?,系统,工作,地址,信息,工具,情况,标准,环境,命令,状态,lin

      linux中命令停止运行?

      linux中命令停止运行?,系统,代码,第一,命令,进程,指令,程序,方法,接线,硬盘,l

      linux命令设置自启动?

      linux命令设置自启动?,服务,系统,信息,数字,检测,工具,状态,密码,跨行,脚本,l

      linux中断进程命令?

      linux中断进程命令?,系统,管理,软件,进程,命令,传播,暂停,结束,信号,程序,在L

      linux进程与磁盘命令?

      linux进程与磁盘命令?,管理,系统,信息,情况,基础,增长,单位,地址,发行,命令,L

      linuxu盘启动命令?

      linuxu盘启动命令?,系统,软件,工具,数据,设备,位置,盘中,电脑,第一,信息,在li

      linux的进程管理命令?

      linux的进程管理命令?,系统,实时,工作,管理,命令,地址,名称,进程,服务,基础,l

      linux中启动软件命令?

      linux中启动软件命令?,环境,软件,电脑,系统,工具,位置,代码,设备,时间,情况,

      linux端口进程命令?

      linux端口进程命令?,系统,情况,地址,网络,信息,状态,灵活,工具,端口,命令,如

      linux自动运行命令?

      linux自动运行命令?,服务,系统,时间,代码,周期性,第一,命令,管理,在线,状态,l

      命令行添加linux启动?

      命令行添加linux启动?,系统,软件,工具,环境,初级,地址,发行,命令,目录,终端,l