Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

Вернуться   Форум программистов > Операционные системы > Windows
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2022, 09:15   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 836
По умолчанию Скрытый запуск консольных приложений с определением PID

Доброго дня!

Не знаю, по адресу или нет, если что проше перенаправить.

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

Сложности:
1. Нужно определить PID запущенной программы, для дальнейшего управления окном.
2. Может быть запущено несколько физических копий этой программы. Отличающиеся местами расположения на диске.
3. Перед стартом нужно проверить нет ли уже запущенных программ. Например, после возникновения ошибок.

Изначально хотел отслеживать программы путем задания "кода" в заголовке окна. Но при скрытом запуске окно не формируется, соответственно у него нет заголовка.

Буду рад советам как решить задачу.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 12.08.2022, 11:53   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,006
По умолчанию

Цитата:
Сообщение от tae1980 Посмотреть сообщение
без создания окна
Цитата:
Сообщение от tae1980 Посмотреть сообщение
для дальнейшего управления окном
Arigato вне форума Ответить с цитированием
Старый 12.08.2022, 12:11   #3
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 836
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Имелось в виду управление запущенным приложением. PID присваивается не окну. В данный момент нужны операции: определить запущено ли нужно приложение или нет, запустить приложение, убить приложение.
Рад что вы внимательно читаете, жаль что у вас нет информации по теме.
С уважением, Алексей.

Последний раз редактировалось tae1980; 12.08.2022 в 12:14.
tae1980 вне форума Ответить с цитированием
Старый 12.08.2022, 13:15   #4
macomics
Форумчанин
 
Регистрация: 17.04.2022
Сообщений: 898
По умолчанию

CreateToolhelp32Snapshot + Process32First + Process32Next + CloseHandle + FindWindowEx + GetWindowThreadProcessId
macomics вне форума Ответить с цитированием
Старый 12.08.2022, 13:40   #5
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 836
По умолчанию

Очень интересно. НО! Это всё для Си и для Дельфи. В данном случае не использую эти языки.
Нужно решение для командной строки, аналог "tasklist".

ЗЫ: В инете в статьях по озвученными вами направлениям можно найти слова "возвращающую PID по названию процесса". К сожалению, у меня нет возможности запустить код и посмотреть возврат, но "название процесса" есть и в tasklist, и это просто название запускаемого файла. А таких заголовков однозначно будет более одного.

В идеале для однозначного нахождения процесса, было бы правильно установить при запуске некий tag, и уже анализировать его. Или увидеть путь к запускаемому файлу.
Вроде есть поле "Caption", в котором выводится как заголовок окна, так и некая информация поясняющая что это за процесс. Но вот как занести информацию сюда, так и не понял.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 12.08.2022, 14:53   #6
macomics
Форумчанин
 
Регистрация: 17.04.2022
Сообщений: 898
По умолчанию

Код:
set exename=svchost.exe
for /F "usebackq tokens=2,9,*" %%I in (`tasklist /v ^| find "%exename%"`) do (
  rem ваши действия с PID, который будет получаться через %%I
  rem и заголовком окна, который будет получен через "%%K"
)
Так как вы не уточняете что именно вам нужно сделать и с чем именно, то остальные действия уже на ваше усмотрение
macomics вне форума Ответить с цитированием
Старый 12.08.2022, 15:11   #7
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 836
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Код:
set exename=svchost.exe
for /F "usebackq tokens=2,9,*" %%I in (`tasklist /v ^| find "%exename%"`) do (
  rem ваши действия с PID, который будет получаться через %%I
  rem и заголовком окна, который будет получен через "%%K"
)
Так как вы не уточняете что именно вам нужно сделать и с чем именно, то остальные действия уже на ваше усмотрение
Вы правы. Задумался.

По коду. А что будет если у меня будет запущено 2, 3, 10 "svchost.exe"? Какой PID он мне вернёт?
При этом "svchost.exe" расположены "c:\1\svchost.exe", "c:\2\svchost.exe", "c:\N\svchost.exe"
"и заголовком окна, который будет получен через "%%K"" При запуске "start /B", окно не формируется, и вместо заголовка окна у процесса выводится "Н/Д".
С уважением, Алексей.

Последний раз редактировалось tae1980; 12.08.2022 в 15:14.
tae1980 вне форума Ответить с цитированием
Старый 12.08.2022, 15:58   #8
macomics
Форумчанин
 
Регистрация: 17.04.2022
Сообщений: 898
По умолчанию

Он вам все перечислит svchost.exe для которых будут получены и PID и Имя окна. Но вы не пишите про то по какому критерию вы отфильтруете процессы. Поэтому вместо строк rem вы можете расположить код для фильтрации процессов и выполнения определенных действий с найденным процессом. Например:
Код:
set exename=svchost.exe
for /F "usebackq tokens=2,9,*" %%I in (`tasklist /v ^| find "%exename%"`) do (
  rem ваши действия с PID, который будет получаться через %%I
  rem и заголовком окна, который будет получен через "%%K"
  echo Процесс %exename% (%%I)
  echo Заголовок кона = "%%K"
  echo Время %%J
)
macomics вне форума Ответить с цитированием
Старый 12.08.2022, 17:12   #9
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 836
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Он вам все перечислит svchost.exe для которых будут получены и PID и Имя окна. Но вы не пишите про то по какому критерию вы отфильтруете процессы.
Именно. Об этом я и писал. При таких вводных невозможно ОДНОЗНАЧНО идентифицировать процесс.
Он мне выдаст 10 строк которые подходят под имя процесса, а в названии окна у всех "Н/Д". И как из этих 10 выбрать нужный? А если нужно найти два процесса?
В это и есть загвоздка.
Я уже пробовал запускать exe'ник не напрямую, а через программу которая узнаёт свои PID и возвращает вызывающей. Но при все попытки сохранить полученный PID при вызове нужной программы провалились (у неё всегда новый PID). Как вариант, можно убить процесс по полученному PID'у и все дочерние процессы. НО! Такой подход не позволит найти РАННЕЕ запущенные процессы.

Пока отказался от убирания окон в фон, приходится мирится с двумя чёрными окнами (запускаются два процесса). И определять их наличие по кодовой фразе в заголовке окна. Млять, 21 век называется.
С уважением, Алексей.

Последний раз редактировалось tae1980; 12.08.2022 в 17:17.
tae1980 вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удобная среда для разработки консольных приложений на языке Pascal Krasiosoft Паскаль, Turbo Pascal, PascalABC.NET 36 19.07.2015 16:25
Переход с консольных приложений на объектные. Руслан555 Visual C++ 3 06.06.2012 15:02
Как отойти от консольных приложений? jallvar Свободное общение 11 01.11.2010 16:22
CreateProcess. Существуют тонкости в запуске консольных приложений? st01en Win Api 10 12.05.2009 11:50