Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978

Активация и закрытие запущенного процесса

25.04.2014, 12:07. Показов 1702. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос, скорее всего простой, но вот никак не могу найти нужную АПИ-функцию.
Я создаю процесс CreateProcess-ом. Этот процесс - оконный. Пользователь может как закрыть этот процесс, так и держать открытым. При повторной попытке создания процесса я проверяю его существование
C++
1
2
3
4
5
     DWORD Code;
     ::GetExitCodeProcess(pi.hProcess, &Code);
     if (Code==STILL_ACTIVE) {
       // И вот тут мне надо активизировать этот процесс, т.е. сделать его окном верхнего уровня
     }
Была мысль послать сообщение окну, но мне же известен HANDLE процесса, а не окна.

Ну и второй вопрос - как этот процесс закрыть? Только TerminateProcess ? Нет ли чего помягче? Опять же, ежели бы я знал окно, послал бы ему WM_CLOSE или как там его...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.04.2014, 12:07
Ответы с готовыми решениями:

Закрытие процесса запущенного программой
Возникло 2 проблемки, собственно нужно запустить справку и при закрытии программы если справка открыта ее тоже закрыть, я делаю таким...

Закрытие процесса, запущенного из-под администратора в учетке пользователя
В профиле пользователя запускается программа из под администратора. Далее ее необходимо завершить, но с правами обычного пользователя этого...

Циклическая проверка наличия запущенного процесса и его закрытие в случае обнаружения
Напишите пожалуйста батник который при запуске начинает бесконечно примерно каждые 5 мин. проверять запущен ли процесс проги hl.exe и если...

5
Заблокирован
25.04.2014, 14:23
Цитата Сообщение от Байт Посмотреть сообщение
При повторной попытке создания процесса я проверяю его существование
Для целей проверки запущенности процесса рекомендую использовать именное (с заданными именем) событие и проверять его существование в самом начала кода процесса, то есть это должны быть первые строчки WinMain
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define EV_ALREADY_RUNNING L"alreadyRunning"
 
//...
int WINAPI WinMain(HINSTANCE AppInstance, HINSTANCE PrevI, LPSTR CLine, int CShow)
{
   HANDLE hEvRunning = OpenEvent(EVENT_ALL_ACCESS, false, EV_ALREADY_RUNNING );
   if (hEvRunning)
   {
    return 0;
   }
   else
   {
    CreateEvent(0,TRUE,FALSE,EV_ALREADY_RUNNING );
   }
//...
Цитата Сообщение от Байт Посмотреть сообщение
Была мысль послать сообщение окну, но мне же известен HANDLE процесса, а не окна.
Если известно заранее имя окна процесса, то можно найти это окно (хэндл окна) посредствам FindWindow и потом уже послать ему сообщение.
Дело в том, что у процесса может быть больше одного окна или же, допустим, окно одно, но имя окна тебе заранее не известно, тогда следует поступить следующим образом:
Вызываешь функцию EnumWindows, для каждого окна вызывать GetWindowThreadProcessID и сравнить полученное значение с имеющимся ID процесса - получатся все top-level окна данного процесса... Вот так вот
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
25.04.2014, 21:05  [ТС]
Цитата Сообщение от WingCommander Посмотреть сообщение
Для целей проверки запущенности процесса рекомендую использовать именное (с заданными именем) событие и проверять его существование в самом начала кода процесса,
Увы, в код запускаемого процесса я доступа не имею. И давать советы разработчику процесса в данном случае сложновато. Если бы это было возможно, то я применил бы такой механизм. Я бы вызвал этот процесс с параметром - HWND своего главного окна. В ответ тот процесс прислал бы мне сообщение с HWND своего окна, и далее мы бы с ним премило обменивались бы SendMessage-ми. Но, повторяю, увы!
Цитата Сообщение от WingCommander Посмотреть сообщение
посредством FindWindow
Пытался. Но имя его класса столь чудовищно, что мне никак не удается его правильно записать. (получил его по ws32, а скопировать не дает). Плюс к этому имя окна (Caption) на русском, посему возможны сложности и неоднозначности с кодировками. Кроме того имя окна - штука переменчивая. В процессе работы программы вполне может меняться.
Пожалуй, остается только через EnumWindows - GetWindowThreadProcessID. Никогда с этим не работал, но попробую.
Спасибо!

Добавлено через 6 часов 10 минут
Цитата Сообщение от Байт Посмотреть сообщение
Пожалуй, остается только через EnumWindows - GetWindowThreadProcessID.
Все прекрасно получилось. Окно (hwn) я определяю. (Кстати, GetWindowThreadProcessID возвращает идентификатор именно потока, создавшего окно). Далее когда хочу посылаю ему PostMessage(hwn, WM_DESTROY, 0, 0)
Когда хочу, вызываю SetForegroundWindow(hwn);
Одна загвоздка. Если пользователь его свернул в трэй, то из трея он не вытаскивается. ShowWindow(hwn, ...) с самыми разными параметрами не помогает. Вместо этого в трее появляется еще одно окно непонятного происхождения. Поиски по Гуглу тоже ничего не дали.
0
9 / 9 / 0
Регистрация: 22.01.2012
Сообщений: 59
25.04.2014, 22:02
Цитата Сообщение от Байт Посмотреть сообщение
Ну и второй вопрос - как этот процесс закрыть? Только TerminateProcess ? Нет ли чего помягче?
можно так:
system ("taskkill /im " name);
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
26.04.2014, 09:20  [ТС]
Цитата Сообщение от Андрей Xomach Посмотреть сообщение
можно так:
Я сделал
C
1
PostMessage(hwn, WM_DESTROY, 0, 0);
но тут видимо много способов.

Добавлено через 1 минуту
Цитата Сообщение от Андрей Xomach Посмотреть сообщение
system ("taskkill /im " name);
Странная строчка... Нет ли тут описок?
0
9 / 9 / 0
Регистрация: 22.01.2012
Сообщений: 59
26.04.2014, 09:38
Байт,
Ну да, это только если name - define
Цитата Сообщение от Андрей Xomach Посмотреть сообщение
system ("taskkill /im " name);
тогда так:
C++
1
system (("taskkill /im " + name).c_str());
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.04.2014, 09:38
Помогаю со студенческими работами здесь

Имя запущенного процесса
Здравствуйте. Хочу открыть файл. Делаю следующим образом: Process process = new Process(); process.StartInfo.FileName =...

Определение запущенного процесса
Здравствуйте, нужен скрипт который определяет запущен ли процесс sethc.exe и если запущен, то запустить другой скрипт vbs, а если не...

Отображение запущенного процесса.
Я пишу программу, и у меня такая штука типо друзей. Разъясню кратко! Есть сайт на нем юзеры (взять тот же форум IPB) - там есть...

Контроль запущенного процесса
С помощью QProcess я запускаю программу. Вот как я связал процесс с окном QObject::connect(ExeProc, SIGNAL(started()), this,...

Проверка запущенного процесса
Ещё раз привет всем! Задача следующая При запуске программы выполнять проверку - Если процесс с данным именем уже запущен,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru