[英]How to find cmd.exe process id from which app is started?
我有一个简单的Win应用程序(使用.net C#编写),需要从cmd.exe启动,然后再写入该控制台,但是问题是我需要该cmd.exe进程的进程ID。 我可以得到所有正在运行的程序,
Process[] procList = Process.GetProcessesByName("cmd");
但是如何找到我的? :)
也许要阅读输入,并检查是否在其中写入了“ ApplicationName.exe”,还是要获得当前处于活动状态的cmd.exe窗口? 但是具有什么功能呢?
将此函数添加到项目的类中的某个位置:(需要在类顶部using System.Runtime.InteropServices;
)
[DllImport("kernel32.dll")]
private static extern bool AttachConsole(int dwProcessId);
[DllImport("kernel32.dll")]
private static extern bool FreeConsole();
然后调用AttachConsole(-1)
现在,您可以像往常一样使用System.Console类向控制台进行写入并设置颜色和其他设置。 如果您不再需要写入控制台,请调用FreeConsole()
以将您的进程从控制台中分离出来。
请注意,这实际上并不会阻止控制台处理其他命令。 仍然允许用户随时在控制台中输入任何内容。
推荐的方式如下:
FreeConsole()
。 Application.Run()
打开表单。 不使用application.Run并且仅显示表单不会创建正确的消息循环,并且可能发生奇怪的事情。 您可以切换3和4,但是一旦调用Application.Run
方法,代码将不会继续,直到关闭窗体。 因此,要么以表单的形式写入控制台并从那里释放它,要么以单独的线程生成表单(这会带来其他意外的副作用)
您可以向AttachConsole函数提供任何进程ID。 -1默认为最可能需要的父进程。
即使您找到“您的” cmd,也要如何写?
有一种更好的方法可以实现您所描述的内容。 只需将您的项目编译为“控制台应用程序”,但无论如何都要让它创建一个WinForms窗口。 是的,有可能,没有什么可以阻止您。 然后,您将可以使用System.Console类向控制台写入内容,而无需任何魔术。
以下代码创建一个WQL事件查询以检测新进程,等待新进程启动,然后显示有关该进程的信息:
WqlEventQuery query = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 1), "TargetInstance isa \"Win32_Process\"");
ManagementEventWatcher watcher = new ManagementEventWatcher(query);
ManagementBaseObject e = watcher.WaitForNextEvent();
Console.WriteLine("Process {0} has been created, path is: {1}",
((ManagementBaseObject)e["TargetInstance"])["Name"],
((ManagementBaseObject)e["TargetInstance"])["ExecutablePath"]);
watcher.Stop();
我认为您可以通过检查此WMI代码示例来找到解决问题的方法。 希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.