Выполнение списка задач в Windows с popen в C без всплывающего окна cmd.exe - PullRequest
4 голосов
/ 25 января 2011

Привет всем и спасибо за ваше время.

Я разрабатываю какое-то приложение для мониторинга на C, и мне нужно было получить список текущих задач. Поэтому я использую список задач и получаю вывод благодаря popen ();

ptr = popen("tasklist /V", "r");
while(1)
{
    if(fgets(temp, 255, ptr) == NULL) break;
    fputs(temp, log);
}

Проблема в том, что в течение нескольких долей секунды появляется окно cmd.exe, и это действительно беспокоит, потому что оно переключает фокус на это новое окно и заставляет мое приложение переходить в оконный режим вместо полноэкранного.

Итак, я потратил несколько дней, чтобы найти этот способ или окно Windows, чтобы запустить этот процесс в «скрытом» режиме / окне, но не получил результата. Вещи, которые я уже пробовал, включают в себя:

cmd.exe /c tasklist /V
start /b cmd.exe /c tasklist /V
start /min /b cmd.exe /c tasklist /V
start /min cmd.exe /c tasklist /V
tasklist > somefile

Я тоже пробовал последний вариант, поэтому я бы прочитал вывод этого somefile , но похоже, что список задач принудительно выводит вывод на стандартный вывод, так как данные не записываются, хотя файл создается.

Надеюсь на ваш ответ и все равно спасибо.

Ответы [ 2 ]

3 голосов
/ 25 января 2011

Этого можно добиться, вызвав CreateProcess, передав SW_HIDE в поле wShowWindow структуры STARTUPINFO и включив CREATE_NO_WINDOW в dwCreationFlags.

Этот метод немного хрупок, поскольку вы можете обнаружить, что ваше приложение работает на компьютере с версией tasklist, имеющей другой формат вывода.

Если вы хотите получить список всех запущенных процессов, вы можете вызвать EnumProcesses.

1 голос
/ 25 января 2011

Задача может быть легко решена с помощью EnumProcesses .

Интуитивно понятный пример здесь .

...