Vb.net 如何从第三方exe获取唯一的进程ID

Vb.net 如何从第三方exe获取唯一的进程ID,vb.net,process,Vb.net,Process,我创建了一个屏幕记录器和流记录器,可以同时运行。我使用FFMPEG来执行录制,这些录制是使用Process.Start()函数触发的。现在,如果两个录制选项都在运行,我将运行两个FFMPEG程序和两个控制台窗口。因此,我需要能够独立地关闭或退出任一录制选项,而不会影响另一个 到目前为止,这是我的代码 Dim cmdstr = "/k ffmpeg.exe -y -probesize 10M -rtbufsize 1500M -f dshow -i audio="&qu

我创建了一个屏幕记录器和流记录器,可以同时运行。我使用FFMPEG来执行录制,这些录制是使用Process.Start()函数触发的。现在,如果两个录制选项都在运行,我将运行两个FFMPEG程序和两个控制台窗口。因此,我需要能够独立地关闭或退出任一录制选项,而不会影响另一个

到目前为止,这是我的代码

    Dim cmdstr = "/k ffmpeg.exe -y -probesize 10M -rtbufsize 1500M -f dshow -i audio=""" & 
    Audio_name & """ -acodec pcm_s16le -f gdigrab -framerate 60 -i desktop -vcodec libx264 -qp 0 
    -threads 0 -crf 18 -preset ultrafast -tune zerolatency " & str & "\Recordings\ScreenRecorder" 
    & FileTime & ".mkv"


                If TestFF = True Then
                    MsgBox("1. Test Mode: " & cmdstr)
                    Process.Start("cmd.exe", "/k ffmpeg.exe -list_devices true -f dshow -i dummy") ' This lists all devices
                    Process.Start("cmd.exe", cmdstr)
                    RTBStreamData1.Text = cmdstr
                    RecordingInProcess = True
                    RecordingOn = True
                Else
                    Dim startInfo As New ProcessStartInfo("cmd.exe")
                    startInfo.Arguments = cmdstr
                    startInfo.WindowStyle = ProcessWindowStyle.Hidden
                    startInfo.CreateNoWindow = True
                    startInfo.UseShellExecute = False
                    Process.Start(startInfo)
                    RecordingInProcess = True
                    RecordingOn = True
                    Dim ProcID As Integer = Process.GetCurrentProcess.Id
                    Label13.Text = ProcID.ToString
我能够获得应用程序本身的ID,但我需要能够同时关闭的是ffmpeg的各个进程和关联的控制台窗口

任何形式的帮助都将不胜感激。多谢各位


在上面的图片中,你可以看到我能够跟踪第一个进程,但不能跟踪第二个

如果我能很好地理解的话:您可以使用的一个技巧可能是将一个“假”自定义参数传递给要逐个启动的每个进程。start()。在循环运行进程之后,您可以识别目标进程。 下面的代码给出了一个想法。(为了避免SQL注入,需要更改SQL字符串中的某些内容)


你好,谢谢你回答我的问题。我设法让它的一部分工作。也就是说,我能够看到windows命令处理器上的额外参数,并且能够看到进程ID。当我要求它关闭时,它确实关闭了。但是,我无法看到FFMPEG额外参数及其PID。因此,它在退出录制后仍在运行。我遵循了您的代码,但不太理解“还为每个进程添加一个整数增量”的注释。你能详细介绍一下吗。谢谢。刚刚在任务管理器上方添加了一个显示正在运行的流程的图像。我必须逐个关闭每个FFMPEG exe。lol@JohnHenderson您可以跟踪要启动的每个进程,甚至“ffmpeg.exe”。我看到您正在向该程序传递一些参数,如“ffmpeg.exe-y-probesize 10M………等”,所以只需在cmdstr的末尾添加一个伪参数(如上面的示例所示,唯一的字符串id将被识别)。因此,成为
cmdstr=cmdstr&“-”&一个唯一的字符串,\u I\u可以在后面找到\u
后面的整数是一些技巧,比如传递给一个进程的唯一的\u ID\u 1,传递给另一个进程的唯一的\u ID\u 2,传递给另一个进程的唯一的\u ID\u 3等等。在循环之后,你可以通过ID找到它们,比如I=0到X→Dim FakeParam=(“唯一的_ID”+I.ToString())→ 使用该命令参数查找我的所有进程…请注意,您必须在每个进程中执行此操作。开始调用→ Process.Start(“file.exe-param1-param2-param3”和MY_-FAKE_-PARAM)
Dim PROCESS_CUSTOM_ARG As String = "UNIQUE_STRING_ID_HERE" '& _1  also add an integer incremental for each process

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim startInfo As New ProcessStartInfo("cmd.exe")
    startInfo.Arguments = " - a lot of your Arguments here"
    startInfo.Arguments &= " - " & PROCESS_CUSTOM_ARG
    startInfo.WindowStyle = ProcessWindowStyle.Hidden
    startInfo.CreateNoWindow = True
    startInfo.UseShellExecute = False
    Process.Start(startInfo)
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim searcher As New System.Management.ManagementObjectSearcher("root\CIMV2", "SELECT ProcessId, CommandLine FROM Win32_Process WHERE CommandLine LIKE '%" & PROCESS_CUSTOM_ARG & "' ")
    For Each p As System.Management.ManagementObject In searcher.Get()
        Dim ProcessId As String = p("ProcessId")
        Dim CommandLine As String = p("CommandLine")
        Console.WriteLine($"CommandLine: {CommandLine} ProcessId: {ProcessId}")
        Dim Proc As Process = Process.GetProcessById(ProcessId)
        Proc.Kill()
    Next
End Sub