![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() здраствуйте.по сабжу поиском нашел много но всё не то...
я так понял мне надо узнать хендл процесса и послать команду завершения. почти везде примеры идут с поиском по имени окна программы,а нужная мне прога сидит в трее,окна нет,только имя процесса. на одном сайте нашел почти то что надо.но данный пример просто берет и завершает процесс (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
|
||||
|
||||
![]() если в программе нет окна как в ней можно нажать "выход"?
Пишу программы за еду. __________________ |
#3
|
|||
|
|||
![]() в трее значок есть на нём пкм-выход,и еще если на значок нажать то окно появляется
|
#4
|
|||
|
|||
![]() Если в трее есть значок, то значит есть и окно. Просто ты его не видишь.
|
#5
|
|||
|
|||
![]() ладно.но неужто нельзя переделать выше написанный код чтоб вместо terminate какой нибудь Close был?
|
#6
|
||||
|
||||
![]() Вместо TerminateProcess пошли сообщение окну WM_CLOSE например.
Помогаю за Спасибо ![]() |
#7
|
|||
|
|||
![]() опять чтото не получается.сообщение же надо посылать в Хэндл?
переделал функцию вот так: Код:
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; |
#8
|
||||
|
||||
![]() Убить по дескриптору окна:
Код:
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
|
|||
|
|||
![]() Цитата:
а как FindWindow можно использовать если я знаю только часть имени окна? то есть там в заголовке (Caption) отображаются некие числовые данные которе меняются ежесекундно |
#10
|
|||
|
|||
![]() По имени класса окна.
Поставь себе какой-нить WinSpy/WinSight и выясни имя класса окна. Потом, получив все окна с таким классом, проверь заголовок на соответсвие шаблону. Ну и найденное окно и убивай. |