![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
закрытие чужого приложения [D7, WinXP]
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.