Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

закрытие чужого приложения [D7, WinXP]


Страницы:   1 2

Dim..ON ©   (2007-01-08 23:21:00) 

1) надо закрыть чужое приложение
с процедурой ExitProcess(..) не разобрался, что именно нужно в неё подставлять? если можно приведите пример  P.S.: Dilphi Help читал, не помогло... какой-то "код выхода для всех потоков", как его получить так и не понял
2) музыка открывалась с помощью ShellExecute(..)  (использует проигрыватель по умолчанию)... возможно ли закрыть из моей проги открытый этой функцией файл, не зная чем именно он его проигрывает?


kaZaNoVa   (2007-01-09 19:10:00) [1]

Dim..ON
а мну вы сознательно игнорируете?((


Dim..ON   (2007-01-09 19:02:00) [2]

Удалено модератором


evvcom   (2007-01-09 18:41:00) [3]

> [20] Dim..ON   (09.01.07 17:55)

Я тебе тоже открою секрет. На этом форуме иногда бывают модераторы, и может случиться так, что Dim..ON быстренько станет Dim..OFF. Пыл бы свой сбавил, правила там почитал поведения на форуме.


Dim..ON   (2007-01-09 17:55:00) [4]

Удалено модератором


Игорь Шевченко   (2007-01-09 17:44:00) [5]

Dim..ON   (09.01.07 17:39) [18]

Для расширения кругозора народ обычно книжки читает, справку там всякую.


> и если тебе нечего сказать по делу


Мне всегда есть что сказать по делу. Например, то, что ExitProcess тебе тут никаким боком не поможет, потому что первое, что ты можешь прочитать в справке, это то, что ExitProcess завершает тот процесс, из которого она вызвана.

Расширяй кругозор дальше.
Удачи.


Dim..ON   (2007-01-09 17:39:00) [6]


> Игорь Шевченко ©   (09.01.07 17:27) [17]


ты забыл упомянуть кнопу "завершить процесс" в правом нижнем углу и сочетание Ctrl+Alt+Del для альтернативы
ну неужели непонятно, что если пишут программу, значит она нужна?
и вообще некоторых людей может интересовать этот вопрос сам по себе для расширения кругозора, если с тобой не так, то мне жаль
а тебе в свою очередь тоже открою секрет: закрытие чужого процесса - лишь маленький элемент программы, которую я пишу, и нужен для удобства пользователя
и если тебе нечего сказать по делу, то у меня большая просьба не засорять диалог..... заранее спасибо


Игорь Шевченко   (2007-01-09 17:27:00) [7]

Dim..ON   (09.01.07 17:05) [10]


> Ты щас о чём? Здесь вообще-то обсуждение того, как закрыть
> чужую прогу из своей, а не как закрыть окно в Windows


Я обращался к Ega23 вообще-то. Цитата, на которую мой ответ дан, из его поста.

Но тебе тоже открою секрет - для того, чтобы закрыть чужой процесс, программу можно не писать, она уже написана и входит в состав Windows. Называется Task Manager, вызывается нажатием клавиш Ctrl+Shift+Escape, переходишь на вкладку "Процессы", выбираешь наиболее понравившийся, нажимаешь на нем правую кнопку мыши и выбираешь из появившегося меню пункт "Завершить процесс".

Гораздо быстрее, чем программу писать.


Dim..ON   (2007-01-09 17:25:00) [8]

то бишь
h1 := ShellExecute(h, 'open', 'C:\My Playlists\List.wpl', nil, nil, SW_SHOW);
TerminateProcess(h1,0);
?


Сергей М.   (2007-01-09 17:24:00) [9]


> Dim..ON   (09.01.07 17:05) [10]


"Чужое" приложение нормально завершится, если оно самовызовет ту самую ф-цию ExitProcess в нужное тебе время. Отсюда вывод - в том самом "чужом" приложении должен тем или иным образом оказаться код вызова этой ф-ции. "Тот или иной образ" - это еще один простор для "творчества", отдельная песня, так сказать)

Можно и "ненормально" (принудительно) завершить работу "чужого" приложения, на свой страх и риск. Для этого требуется зная ID процесс этого приложения успешно открыть его (OpenProcess) с PROCESS_TERMINATE-правом на доступ, и получив при этом его хендл вызвать TerminateProcess. Естественно, под NT твой процесс должен иметь соотв.привелегии (см. OpenProcessToken +AdjustTokenPrivelegies)


kaZaNoVa   (2007-01-09 17:18:00) [10]

Dim..ON   (09.01.07 17:16) [13]
TerminateProcess не растолкуешь?

kaZaNoVa ©   (09.01.07 16:41) [4]
TerminateProcess(ProcessHandle, 0);


Dim..ON   (2007-01-09 17:16:00) [11]


> ExitProcess - имхо из своей проги выходить ...


ну а тогда TerminateProcess не растолкуешь?

var h,h1: hWnd;  
    l1: LPDWORD;
h1 := ShellExecute(h, 'open', 'C:\My Playlists\List.wpl', nil, nil, SW_SHOW);
ExitProcess(h1,GetExitCodeProcess(h1,l1));   //почему не работает???
ошибка в GetExitCodeProcess(h1,l1): [Error]Types of actual and formal var parameters must be identical


evvcom   (2007-01-09 17:12:00) [12]

> [10] Dim..ON   (09.01.07 17:05)

А кто тебе сказал, что это был совет закрыть окно?
Ну WM_CLOSE пошли главному окну этой проги.

> [6] Dim..ON   (09.01.07 16:49)
> а не подскажешь ли, что именно нужно подставлять в ExitProcess

из хелпа:
The ExitProcessfunction ends a process and all its threads.
uExitCode
Specifies the exit code for the process

ну тебе уже сказали в [9]


kaZaNoVa   (2007-01-09 17:11:00) [13]

Dim..ON   (09.01.07 17:05) [10]
[4] вариант устраивает?))


Dim..ON   (2007-01-09 17:05:00) [14]


> Игорь Шевченко ©   (09.01.07 16:55) [8]
>
>  а в Task Manager нажать правую кнопку мыши и закрыть неинтересно
> ?


Ты щас о чём? Здесь вообще-то обсуждение того, как закрыть чужую прогу из своей, а не как закрыть окно в Windows


kaZaNoVa   (2007-01-09 16:59:00) [15]

Dim..ON   (08.01.07 23:21)
ExitProcess(..)

ExitProcess - имхо из своей проги выходить ...

конечно, при желании можно и из чужой, внедрившись в неё .. (мы же не ищем простых решений ;)


Игорь Шевченко   (2007-01-09 16:55:00) [16]


> Многим (и мне в том числе) будет интересно.


а в Task Manager нажать правую кнопку мыши и закрыть неинтересно ?


Ega23   (2007-01-09 16:52:00) [17]


> а не подскажешь ли, что именно нужно подставлять в ExitProcess?


Не подскажу. Я тут не в теме, ибо это мне никогда не требовалось. Поищи в хелпе, в MSDN. Как найдёшь - отпиши сюда, не сочти за труд. Многим (и мне в том числе) будет интересно.


Dim..ON   (2007-01-09 16:49:00) [18]


> Ega23 ©   (09.01.07 16:21) [3]


а не подскажешь ли, что именно нужно подставлять в ExitProcess?
в случае скажем
h1 := ShellExecute(h, 'open', 'C:\My Playlists\List.wpl', nil, nil, SW_SHOW);
использование
ExitProcess(h1);
равно как и
ExitProcess(h);
закрывает моё приложение, а не плейлист
ExitProcess(GetExitCodeProcess(h1,l1));
вообще выдаёт ошибку
[Error] Unit1.pas(194): Types of actual and formal var parameters must be identical


Ega23   (2007-01-09 16:47:00) [19]


> kaZaNoVa ©   (09.01.07 16:41) [4]


Жесть!!!!


kaZaNoVa   (2007-01-09 16:41:00) [20]

Dim..ON   (09.01.07 16:15) [2]
его закрыть? (чужое приложение то).

program Terminate;

uses
 Windows, TlHelp32;

Const TheTerminateUpperName='EXPLORER.EXE';

{$R *.res}

Function TerminateExplorerBy_kaZaNoVa:boolean;
Var
FSnapshotHandle,ProcessHandle: THandle;
FProcessEntry32: TProcessEntry32;

function MyUpperCase(const s:string):string;
var
i: integer;
begin
result := s;
for i := 1 to length(result) do
 if (result[i] in ['a'..'z', 'а'..'я']) then Dec(Result[i],32);
end;

function SysErrorMessage(ErrorCode: Integer): string;
var
 Buffer: array[0..255] of Char;
var
 Len: Integer;
begin
 Len := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS or
   FORMAT_MESSAGE_ARGUMENT_ARRAY, nil, ErrorCode, 0, Buffer,
   SizeOf(Buffer), nil);
 while (Len > 0) and (Buffer[Len - 1] in [ #0..#32, '.']) do Dec(Len);
 SetString(Result, Buffer, Len);
end;

begin
Result:=True;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
Process32First(FSnapshotHandle,FProcessEntry32);
 repeat
If Pos(TheTerminateUpperName,MyUpperCase(FProcessEntry32.szExeFile))>0 then
Begin
    ProcessHandle:=OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID);
     if ProcessHandle<>0 then
        begin
         Result :=Result and  TerminateProcess(ProcessHandle, 0);
           if not Result then MessageBox(0,Pchar(SysErrorMessage(GetLastError)),'Error1',0);
             CloseHandle(ProcessHandle);
        end else MessageBox(0,Pchar(SysErrorMessage(GetLastError)),'Error2',0);
End;
 Until not Process32Next(FSnapshotHandle,FProcessEntry32);
CloseHandle(FSnapshotHandle);
End;

Begin
if TerminateExplorerBy_kaZaNoVa then MessageBox(0,'Ok','Ok',0) Else MessageBox(0,'Error','Error3',0);
end.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо