Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Вниз

закрытие чужого приложения   Найти похожие ветки 

 
Dim..ON   (2007-01-08 23:21) [0]

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


 
Орион ©   (2007-01-08 23:24) [1]

> [0] Dim..ON   (08.01.07 23:21)

сюдя по 2 ты просто хочешь музыкальный файл воспроизвести? Тогда TMediaPlayer возьми или bass.dll с интерфейсом к ней (в сети найдешь с полпинка).


 
Dim..ON   (2007-01-09 16:15) [2]


> сюдя по 2 ты просто хочешь музыкальный файл воспроизвести?
>  Тогда TMediaPlayer возьми или bass.dll с интерфейсом к
> ней (в сети найдешь с полпинка).


да не, ты не понял... TMediaPlayer это элементарно как два пальца об асфальт, мне надо именно другими проигрывателями... ShellExecute(..) взял, потому что он открывает медиа-плейер, используемый по умолчанию (для удобства юзера, чтобы привычнее ему было), хотя можно было и CreateProcess(..), и WinExec(..) ... но как я понимаю для закрытия запущенного приложения не важно, чем я его открываю... так вот мне и нужно знать как его закрыть? (чужое приложение то)... если кто знает как можно закрыть его, не зная какое приложение используется по умолчанию, буду благодарен, если подскажете... если же нет, то хотя бы подскажите, что нужно подставлять в ExitProcess(..) и откуда это что-то взять?


 
Ega23 ©   (2007-01-09 16:21) [3]



he ShellExecute function opens or prints a specified file. The file can be an executable file or a document file. See ShellExecuteEx also.

HINSTANCE ShellExecute(

   HWND hwnd, // handle to parent window
   LPCTSTR lpOperation, // pointer to string that specifies operation to perform
   LPCTSTR lpFile, // pointer to filename or folder name string
   LPCTSTR lpParameters, // pointer to string that specifies executable-file parameters
   LPCTSTR lpDirectory, // pointer to string that specifies default directory
   INT nShowCmd  // whether file is shown when opened
  );

.................

Return Values

If the function succeeds, the return value is the instance handle of the application that was run, or the handle of a dynamic data exchange (DDE) server application.


 
kaZaNoVa ©   (2007-01-09 16:41) [4]

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.


 
Ega23 ©   (2007-01-09 16:47) [5]


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


Жесть!!!!


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


> 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:52) [7]


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


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


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


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


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


 
kaZaNoVa ©   (2007-01-09 16:59) [9]

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

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

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


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


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


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


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

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


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

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

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

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

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

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


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


> 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


 
kaZaNoVa ©   (2007-01-09 17:18) [14]

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

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


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


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


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

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


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

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


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

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


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


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

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

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


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


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


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


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

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

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


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


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

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


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

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


 
evvcom ©   (2007-01-09 18:41) [21]

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

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


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

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


 
kaZaNoVa ©   (2007-01-09 19:10) [23]

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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.045 c
2-1168356392
vitv
2007-01-09 18:26
2007.01.28
FireBird1.5-не работает запрос


15-1167758067
kaZaNoVa
2007-01-02 20:14
2007.01.28
Пространств вариантов или свобода выбора


15-1167912546
Ксардас
2007-01-04 15:09
2007.01.28
Подскажите как отключить...


2-1168179097
Михаил_
2007-01-07 17:11
2007.01.28
Разблокировка файла


15-1168249479
Parus
2007-01-08 12:44
2007.01.28
ASP VBSCRIPT





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский