Как найти идентификатор процесса cmd.exe, из которого запускается приложение? - PullRequest
0 голосов
/ 22 апреля 2010

У меня есть простое приложение win (написанное с использованием .net C #), которое нужно запустить из cmd.exe, а затем записать в эту консоль, но проблема в том, что мне нужен идентификатор процесса из этого процесса cmd.exe.Я могу получить весь запущенный процесс,

Process[] procList = Process.GetProcessesByName("cmd");

, но как найти мой?:)

Может быть, чтобы прочитать ввод и проверить, написано ли внутри «ApplicationName.exe» или открыть окно cmd.exe?Но с какой функцией?

Ответы [ 3 ]

0 голосов
/ 22 апреля 2010

Следующий код создает запрос события 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. Надеюсь, это поможет.

0 голосов
/ 28 августа 2014

Добавьте эти функции где-нибудь в классе к вашему проекту: (требуется 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. -1 по умолчанию для родительского процесса, что, скорее всего, то, что вы хотите.

0 голосов
/ 22 апреля 2010

Даже если вы найдете «ваш» cmd, как вы собираетесь писать в него?

Есть лучший способ добиться того, что вы описываете. Просто скомпилируйте ваш проект как «Консольное приложение», но все равно создайте окно WinForms. Да, это возможно, ничто не останавливает вас от этого. Тогда вы сможете писать в консоль, используя ваш класс System.Console, никакой магии не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...