Vb.net 如何从第三方exe获取唯一的进程ID
我创建了一个屏幕记录器和流记录器,可以同时运行。我使用FFMPEG来执行录制,这些录制是使用Process.Start()函数触发的。现在,如果两个录制选项都在运行,我将运行两个FFMPEG程序和两个控制台窗口。因此,我需要能够独立地关闭或退出任一录制选项,而不会影响另一个 到目前为止,这是我的代码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
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