Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

Как узнать запущено ли приложение? Подскажите функцию   Найти похожие ветки 

 
lovres   (2004-12-20 15:49) [0]

Надо по имени приложения из другого приложения узнать запущено ли оно, какими функциями это реализуется?


 
ssk ©   (2004-12-20 15:55) [1]

>по имени приложения

что Вы имеете ввиду под этим понятием? имя ЕХЕ файла или заголовок окна?


 
Digitman ©   (2004-12-20 15:55) [2]

любыми ф-циями, предназначенными для открытия файла с правами на запись


 
lovres   (2004-12-20 16:22) [3]


> ssk ©  

по названию exe-файла


> Digitman ©
любыми ф-циями, предназначенными для открытия файла с правами на запись

Мне кажется это как-то жестоко


 
lovres   (2004-12-20 16:22) [4]


> ssk ©  

по названию exe-файла


> Digitman ©
любыми ф-циями, предназначенными для открытия файла с правами на запись

Мне кажется это как-то жестоко


 
tradakad   (2004-12-20 16:36) [5]

find_hwn:=findwindow(nil,"Безымянный - Блокнот");
if find_hwn>0 then showmessage("Безымянный - Блокнот is running")
else showmessage("Безымянный - Блокнот is not running");


 
tradakad   (2004-12-20 16:38) [6]

find_hwn:=findwindow(nil,"Безымянный - Блокнот");
if find_hwn>0 then showmessage("Безымянный - Блокнот is running")
else showmessage("Безымянный - Блокнот is not running");


 
DVM ©   (2004-12-20 16:40) [7]


> tradakad   (20.12.04 16:38) [6]

а если у программы нет окон? ;)


 
tradakad   (2004-12-20 16:41) [8]

find_hwn:=findwindow(nil,"Безымянный - Блокнот");
if find_hwn>0 then showmessage("Безымянный - Блокнот is running")
else showmessage("Безымянный - Блокнот is not running");


 
ssk ©   (2004-12-20 16:46) [9]

вот в каком-то факе давно нашел такую процедуру. она убивает процессы по ЕХЕ имени. немного доработав код (посмотреть на переменную ContinueLoop), можно получить желаемую процедуру.

uses
 Tlhelp32;

function KillTask(ExeFileName: string): Integer;
const
 PROCESS_TERMINATE = $0001;
var
 ContinueLoop: BOOL;
 FSnapshotHandle: THandle;
 FProcessEntry32: TProcessEntry32;
begin
 Result := 0;
 FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
 ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

 while Integer(ContinueLoop) <> 0 do
 begin
   if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
     UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
     UpperCase(ExeFileName))) then
     Result := Integer(TerminateProcess(
                       OpenProcess(PROCESS_TERMINATE,
                                   BOOL(0),
                                   FProcessEntry32.th32ProcessID),
                                   0));
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
 end;  
 CloseHandle(FSnapshotHandle);
end;


 
ssk ©   (2004-12-20 16:48) [10]

продолжение...

то есть вот этот кусок вырезать
while Integer(ContinueLoop) <> 0 do
begin
  if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
    UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
    UpperCase(ExeFileName))) then
    Result := Integer(TerminateProcess(
                      OpenProcess(PROCESS_TERMINATE,
                                  BOOL(0),
                                  FProcessEntry32.th32ProcessID),
                                  0));
   ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;  


а вместо него написать что-то вроде

Result := Integer(ContinueLoop) <> 0;


 
Digitman ©   (2004-12-20 16:49) [11]


> по имени приложения


> Мне кажется это как-то жестоко


а мне кажется не менее жестоким называть ЗДЕСЬ "приложением" невесть что ..

и тем более ничтоже сумняшеся утверждать, что якобы чего-то там "по имени приложения". с учетом того что у приложения НЕТ имени.


 
tradakad   (2004-12-20 16:51) [12]

Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO
BEGIN
  IF (Wnd <> Application.Handle) AND
  IsWindowVisible(Wnd) AND
  (GetWindow(Wnd, gw_Owner) = 0) AND
  (GetWindowText(Wnd, buff, sizeof(buff)) <> 0)
  THEN
  BEGIN
     GetWindowText(Wnd, buff, sizeof(buff));
     if if strpas(buff)="имя проги" then showmessage("прога is running")
else showmessage("прога is not running");
  END;
  Wnd := GetWindow(Wnd, gw_hWndNext);


 
DVM ©   (2004-12-20 16:55) [13]


> tradakad   (20.12.04 16:51) [12]

end забыл в конце.
Опять же [7].

P.S. Использование GetWindow чревато попаданием в бесконечный цикл. Лучше EnumWindows()


 
tradakad   (2004-12-20 17:49) [14]

для DVM ©   (20.12.04 16:55) [13]
имхо я понял что найти нужно какуюто конкретную прогу, а если ничего не знаешь искать нужно все задачи и там уже убивать ту ИМЯ КОТОРОЙ ДАЖЕ НЕ ЗНАЕШЬ . смешно звучит не правда ли? опять таки это всего лишь ИМХО )


 
lovres   (2004-12-21 15:52) [15]

Вариант, предложенный ssk на мой взгляд очень хорош, но, к сожалению, программа должна работать под NT4, а там ф-ция CreateToolhelp32Snapshot работает некорректно :(


 
Clipper Chip   (2004-12-21 16:16) [16]

Почему CreateToolhelp32Snapshot работает не корректно,
с этими параметрами под NT должна работать нормально.
Вот еще у меня есть процедурка, которая убивает другую прогу если уже есть запущенная с таким же именем. Вот там посмотри есть как раз получение имени запущенного приложения. :)

procedure Terminator;
var
  ProcessHandle,aProcessHandle: THandle;
  ProcessID: DWORD;
  handler: thandle;
  data: TProcessEntry32;
  Path: array [0..MAX_PATH] of char;
  osVerInfo: TOSVersionInfo;

 procedure VerifyLoadProcessNT;
  function GetProcessHandle(ProcessID: DWORD): THandle;
  begin
    Result:=OpenProcess(PROCESS_VM_READ or PROCESS_QUERY_INFORMATION, True, ProcessID);
  end;
 begin
   handler:=createtoolhelp32snapshot(TH32CS_SNAPPROCESS,0);
   data.dwSize:=sizeof(data);
   if process32first(handler,data) then
   begin
     GetModuleFileNameEx(GetProcessHandle(data.th32ProcessID), 0,path, MAX_PATH);
     aProcessHandle:=0;
     aProcessHandle:=OpenProcess(PROCESS_TERMINATE,TRUE, data.th32ProcessID);
     if (ExtractFileName(paramstr(0))=ExtractFileName(path))and(ProcessID<>data.th32ProcessID) then
       TerminateProcess(aProcessHandle,0);
     CloseHandle(aProcessHandle);
     while process32next(handler,data) do
     begin
       GetModuleFileNameEx(GetProcessHandle(data.th32ProcessID), 0,path, MAX_PATH);
       aProcessHandle:=0;
       aProcessHandle:=OpenProcess(PROCESS_TERMINATE,TRUE, data.th32ProcessID);
       if (ExtractFileName(paramstr(0))=ExtractFileName(path))and(ProcessID<>data.th32ProcessID) then
         TerminateProcess(aProcessHandle,0);
       CloseHandle(aProcessHandle);
     end;
   end;
   CloseHandle(handler);
 end;

 procedure VerifyLoadProcess9x;
 begin
   handler:=createtoolhelp32snapshot(TH32CS_SNAPALL,0);
   data.dwSize := SizeOf(data);
   if process32first(handler,data) then
   begin
     aProcessHandle:=0;
     aProcessHandle:=OpenProcess(PROCESS_TERMINATE,TRUE, data.th32ProcessID);
     if (ExtractFileName(paramstr(0))=ExtractFileName(data.szExeFile))and(ProcessID<>data.th32ProcessID) then
       TerminateProcess(aProcessHandle,0);
     CloseHandle(aProcessHandle);
     while process32next(handler,data) do
     begin
       aProcessHandle:=0;
       aProcessHandle:=OpenProcess(PROCESS_TERMINATE,TRUE, data.th32ProcessID);
       if (ExtractFileName(paramstr(0))=ExtractFileName(data.szExeFile))and(ProcessID<>data.th32ProcessID) then
         TerminateProcess(aProcessHandle,0);
       CloseHandle(aProcessHandle);
     end;
   end;
   CloseHandle(handler);
 end;

begin
  ProcessID:=GetCurrentProcessID;
  ProcessHandle:=OpenProcess(PROCESS_SET_INFORMATION,false,ProcessID);
  osVerInfo.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo);
  if GetVersionEx(osVerInfo) then
  begin
    if osVerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then VerifyLoadProcessNT;
    if osVerInfo.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS then VerifyLoadProcess9x;
  end;
  CloseHandle(ProcessHandle);
end;


 
Leonid Troyanovsky ©   (2004-12-21 16:48) [17]


> Clipper Chip   (21.12.04 16:16) [16]
> Почему CreateToolhelp32Snapshot работает не корректно,
> с этими параметрами под NT должна работать нормально.


Может она бы и работала, но в NT4 ее просто нет.
Как нет и psapi,pdh.dll, откуда GetModuleFileNameEx
(ставятся отдельно).

--
С уважением, LVT.



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

Текущий архив: 2005.02.06;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.025 c
14-1105807246
hamster
2005-01-15 19:40
2005.02.06
Кладовка


6-1101039444
Vasiliy
2004-11-21 15:17
2005.02.06
CGI и Delphi


1-1106071661
Никита
2005-01-18 21:07
2005.02.06
Как затолкать в SubItems ListView a компонент?


1-1106390829
stone
2005-01-22 13:47
2005.02.06
Окружность вписанная в квадрат


11-1089131367
Андрей
2004-07-06 20:29
2005.02.06
Наследник KOLEditBox и метод OnPaint