繁体   English   中英

如何查找从哪个应用程序启动的cmd.exe进程ID?

[英]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()以将您的进程从控制台中分离出来。

请注意,这实际上并不会阻止控制台处理其他命令。 仍然允许用户随时在控制台中输入任何内容。

推荐的方式如下:

  1. 创建一个控制台应用程序
  2. 随便写什么。
  3. 不再需要时调用FreeConsole()
  4. 使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM