Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.11.2011, 17:03
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию завершить программу зная имя процесса

здраствуйте.по сабжу поиском нашел много но всё не то...
я так понял мне надо узнать хендл процесса и послать команду завершения.
почти везде примеры идут с поиском по имени окна программы,а нужная мне прога сидит в трее,окна нет,только имя процесса.
на одном сайте нашел почти то что надо.но данный пример просто берет и завершает процесс (terminate) а мне надо както послать такую команду,как будто в программе нажали "выход".чтоб результат работы программы сохранился перед закрытием.
вот пример,может както поможете изменить его чутка?
Код:
uses Tlhelp32;
...
function KillTask(ExeFileName:string):integer;
const
PROCESS_TERMINATE=$0001;
var
Co:BOOL;
FS:THandle;
FP:TProcessEntry32;
begin
result:=0;
FS:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FP.dwSize:=Sizeof(FP);
Co:=Process32First(FS,FP);
while integer(Co) <> 0 do
begin
if ((UpperCase(ExtractFileName(FP.szExeFile))=UpperCase(ExeFileName)) or
(UpperCase(FP.szExeFile)=UpperCase(ExeFileName))) then
Result:=Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),
FP.th32ProcessID),0));
Co:=Process32Next(FS,FP);
end;
CloseHandle(FS);
end;
Ответить с цитированием
  #2  
Старый 06.11.2011, 17:25
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

если в программе нет окна как в ней можно нажать "выход"?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 06.11.2011, 17:35
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

в трее значок есть на нём пкм-выход,и еще если на значок нажать то окно появляется
Ответить с цитированием
  #4  
Старый 06.11.2011, 20:10
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Если в трее есть значок, то значит есть и окно. Просто ты его не видишь.
Ответить с цитированием
  #5  
Старый 06.11.2011, 20:54
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

ладно.но неужто нельзя переделать выше написанный код чтоб вместо terminate какой нибудь Close был?
Ответить с цитированием
  #6  
Старый 06.11.2011, 21:11
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Вместо TerminateProcess пошли сообщение окну WM_CLOSE например.
__________________
Помогаю за Спасибо
Ответить с цитированием
  #7  
Старый 06.11.2011, 21:36
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

опять чтото не получается.сообщение же надо посылать в Хэндл?
переделал функцию вот так:
Код:
if ((UpperCase(ExtractFileName(FP.szExeFile))=UpperCase(ExeFileName)) or
(UpperCase(FP.szExeFile)=UpperCase(ExeFileName))) then
   begin
   hndl:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, FP.th32ProcessID);//получаю хэндл найденного процесса
   ShowMessage(IntToStr(hndl));//для отладки
   //SendMessage(hndl,WM_CLOSE,0,0);
   end;
и вот каждый раз показывается один и тот же хэндл! при первом нажатии кнопки 304,потом 308 и каждый раз больше на 4.
Ответить с цитированием
  #8  
Старый 08.11.2011, 11:56
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию

Убить по дескриптору окна:

Код:
var PID:Cardinal;
hProc:Cardinal;
begin
GetWindowThreadProcessId(Handle,PID);
hProc:=OpenProcess(PROCESS_TERMINATE,true,PID);
TerminateProcess(hProc,0);
end;

Если же нужно закрыть форму, то используй

FindWindow, а потом CloseWindow ( ну или DestroyWindow)
__________________
Хорошо написанная программа не требует документации
ICQ 9-184-668.
Ответить с цитированием
  #9  
Старый 08.11.2011, 20:27
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

Цитата:
Сообщение от Thrasher
Убить по дескриптору окна:
Если же нужно закрыть форму, то используй
FindWindow, а потом CloseWindow ( ну или DestroyWindow)

а как FindWindow можно использовать если я знаю только часть имени окна? то есть там в заголовке (Caption) отображаются некие числовые данные которе меняются ежесекундно
Ответить с цитированием
  #10  
Старый 08.11.2011, 20:57
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

По имени класса окна.
Поставь себе какой-нить WinSpy/WinSight и выясни имя класса окна. Потом, получив все окна с таким классом, проверь заголовок на соответсвие шаблону. Ну и найденное окно и убивай.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:44.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025