我有简单的win应用程序(使用.net C#编写)需要从cmd.exe启动,然后写入该控制台,但问题是我需要来自该cmd.exe进程的进程ID。我可以得到所有正在运行的过程,
Process[] procList = Process.GetProcessesByName("cmd");
但如何找到我的? :)
也许要读取输入,并检查里面是“ApplicationName.exe”写入,还是要获得活跃的cmd.exe窗口?但是有什么功能?
答案 0 :(得分:0)
即使你找到“你的”cmd,你打算怎么写呢?
有更好的方法来实现您所描述的内容。只需将您的项目编译为“控制台应用程序”,但无论如何都要创建一个WinForms窗口。是的,有可能,没有什么可以阻止你。然后,您可以使用System.Console类写入控制台,无需任何魔法。
答案 1 :(得分:0)
以下代码创建一个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代码示例找到问题的解决方案。希望它有所帮助。
答案 2 :(得分:0)
将类中的某些功能添加到项目中:
(在课程上需要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默认为父进程,这很可能是你想要的。