Vb.net 我可以向没有窗口的孤立命令行进程发送命令吗?
我一直在尝试构建一个用于自动化命令行服务器的小型GUI(好吧,这是Minecraft BDS)。当我在做一些测试时,我意外地(不止一次)在服务器正确关闭之前停止了调试器,这导致可执行文件的进程“孤立”。我甚至在任务管理器中都找不到它,所以我转而在代码中为任何已经运行的Vb.net 我可以向没有窗口的孤立命令行进程发送命令吗?,vb.net,command,console-application,Vb.net,Command,Console Application,我一直在尝试构建一个用于自动化命令行服务器的小型GUI(好吧,这是Minecraft BDS)。当我在做一些测试时,我意外地(不止一次)在服务器正确关闭之前停止了调试器,这导致可执行文件的进程“孤立”。我甚至在任务管理器中都找不到它,所以我转而在代码中为任何已经运行的basem\u server.exe实例添加一个检查,然后简单地将其删除。但是,我希望能够允许服务器软件“正常”关闭,而不仅仅是终止进程 我的问题是,由于命令窗口不可见,并且不再“绑定”到我的应用程序实例,是否有任何方法向其发送st
basem\u server.exe
实例添加一个检查,然后简单地将其删除。但是,我希望能够允许服务器软件“正常”关闭,而不仅仅是终止进程
我的问题是,由于命令窗口不可见,并且不再“绑定”到我的应用程序实例,是否有任何方法向其发送stop
命令以允许其正常关闭
我已尝试使用StandardInput
,但由于我的应用程序的当前实例不是实际启动进程的实例,因此它无法写入孤立进程的StandardInput
:
myProc.StandardInput.WriteLine(“停止”)
导致异常,System.InvalidOperationException:“未重定向StandardIn。”
我考虑过使用SendKeys
:
AppActivate(myProc.Id)
My.Computer.Keyboard.SendKeys(“停止”)
但是当我尝试激活进程时,AppActivate
失败,出现异常,System.ArgumentException:“找不到进程“[Id]”。
使用myProc.Kill()
确实会终止进程,我只是想知道是否有一个“核”更少的选项
我想弄明白这一点的另一个原因是,我希望能够重用现有/正在运行的服务器进程,而不是杀死它。但是,如果我不知道如何连接到该进程以发出命令,我唯一的选择(此时)是终止该进程并使用新实例重新开始
我的代码 作为参考,我用来启动服务器的代码是:
'------------------------------
'位于另一个文件中的公共变量声明
公共BDS_过程作为过程
'------------------------------
Dim ServerStartInfo作为新进程STARTINFO
使用ServerStartInfo
.FileName=
.UseShellExecute=False
.WindowsStyle=ProcessWindowsStyle.Hidden
.CreateNoWindow=True
.RedirectStandardError=True
.RedirectStandardOutput=True
.RedirectStandardInput=True
以
BDS_PROC=新工艺
使用BDS_程序
.StartInfo=ServerStartInfo
.EnableRaisingEvents=True
AddHandler.OutputDataReceived,BDSMessageReceived的地址
AddHandler.ErrorDataReceived,BDSRErrorReceived的地址
.Start()
.BeginErrorReadLine()
.BeginOutputReadLine()
以
对当前“孤立”运行的进程(我发送stop
命令的失败尝试被注释掉)的完整检查是:
公共函数IsInstanceRunning()作为布尔值
Dim IsRunning为布尔值=真
Dim Proc As Process()=Process.getProcessByName(“U服务器”)
如果进程计数>0,则
If MessageBox.Show(“服务器已在运行[”&Proc.Count.ToString&“实例)]”&vbCrLf&vbCrLf&
“是否要停止当前正在运行的服务器?”,
“服务器正在运行”,
MessageBoxButtons.YesNo,MessageBoxIcon.叹号)=DialogResult。然后是
尝试
对于p作为整数=0的过程计数-1
'Proc(p).StandardInput.WriteLine(“停止”)
Proc(p.Kill)()
下一个p
IsRunning=False
特例
“试试看
'AppActivate(进程(0.Id))
'My.Computer.Keyboard.SendKeys(“停止”)
'捕获ex2作为异常
“结束尝试
MessageBox.Show(例如Message)
结束尝试
如果结束
如果结束
返回正在运行
端函数
编辑: 我从a中找到了一个代码建议,并尝试采用该实现。我没有得到任何异常或错误,但不幸的是,它也没有真正停止服务器。以下代码仅供参考,以防对其他人有所帮助:
导入System.Runtime.InteropServices
导入系统文本
模块公共
私有函数GetConsoleTitle(ByVal lpConsoleTitle作为StringBuilder,ByVal nSize作为UInteger)作为UInteger
端函数
私有函数FindWindow(ByVal zeronly作为IntPtr,ByVal lpWindowName作为字符串)作为IntPtr
端函数
私有函数AttachConsole(ByVal dwProcessId作为UInteger)作为布尔值
端函数
作为布尔值的私有函数FreeConsole()
端函数
私有函数SetForegroundWindow(ByVal hWnd作为IntPtr)作为布尔值
端函数
公共函数IsInstanceRunning()作为布尔值
Dim IsRunning为布尔值=真
Dim Proc As Process()=Process.getProcessByName(“U服务器”)
如果进程计数>0,则
If MessageBox.Show(“服务器已在运行[”&Proc.Count.ToString&“实例)]”&vbCrLf&vbCrLf&
“是否要停止当前正在运行的服务器?”,
“服务器正在运行”,
MessageBoxButtons.YesNo,MessageBoxIcon.叹号)=DialogResult。然后是
尝试
对于p作为整数=0的过程计数-1
免费控制台()