Правильное завершение процесса - как правильно сделать?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Правильное завершение процесса - как правильно сделать?

Сообщение t116 » 28.02.2008 (Чт) 14:23

Нужно, зная pID программы, закрыть ее из своей программы. Terminate process не подходит т.к. некоторые программы (которые следует закрыть) при этом не сохраняют настройки при выходе. Посылка главной форме программы сигнала WM_QUIT тоже не подходит т.к. главное окно программы неизвестно.

Как можно решить эту задачу?

PS. В поиске нашел только terminate process и SendMessage WM_QUIT.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 28.02.2008 (Чт) 14:44

А как программа закрывается пользователями?
Lasciate ogni speranza, voi ch'entrate.

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 28.02.2008 (Чт) 15:31

Все поразному...

Объясню зачем это.
Сделал в своей программе (счетчик трафика) возможность завершать указанные программы при разрыве связи с сетью. Сделал это используя Terminate Process. Но так получается что некоторые программы после terminate оставляют свою иконку в трее и не сохраняют настройки при выходе. Пока не подведешь мышь в трей иконка не исчезнет.

Вот и думаю есть ли более правильный способ закрытия?

ЗЫ. Пробовал еще вариант с выгрузкой всех окон принадлежащих процессу перед terminate, но мне этот способ неочень понравился.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.02.2008 (Пт) 8:34

Универсального способа нет.
Посылка главной форме программы сигнала WM_QUIT тоже не подходит т.к. главное окно программы неизвестно.
Его можно попробовать найти.
А я все практикую лечение травами...

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 29.02.2008 (Пт) 12:34

Twister писал(а):Его можно попробовать найти.


Как?


Перед выключением Windows закрывает все программы. Каким образом она это делает?

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 29.02.2008 (Пт) 23:37

Twister писал(а):Универсального способа нет.
Посылка главной форме программы сигнала WM_QUIT тоже не подходит т.к. главное окно программы неизвестно.
Его можно попробовать найти.


Перечислить все окна через GetWindow

Код: Выделить всё

hwndParent= GetDesktopWindow()

'get the first child
hWndChild = GetWindow(hwndParent, GW_CHILD)
......

'get the next hwnd
    hWndChild = GetWindow(hWndChild, GW_HWNDNEXT)


Далее можно определить для найденных окон имя класса. Ну а затем углубиться внутрь этих окон с целью поиска видимых потомков. Но нужно иметь априорные знания по иерархии окон конкретных родителей.

t116
Бывалый
Бывалый
 
Сообщения: 209
Зарегистрирован: 12.01.2007 (Пт) 12:11

Сообщение t116 » 02.03.2008 (Вс) 2:10

А если программа не содержит окон?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 03.03.2008 (Пн) 8:56

Если у нее имеется значок в трее, значит и окно есть.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 92

    TopList