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

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

Как узнать запущено ли приложение? Подскажите функцию [D6, WinXP]


lovres ©   (2004-12-20 15:49:00) 

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


Leonid Troyanovsky   (2004-12-21 16:48:00) [1]


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


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

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


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

Почему 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;


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

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


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

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


DVM   (2004-12-20 16:55:00) [5]


> tradakad   (20.12.04 16:51) [12]

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

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


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

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);


Digitman   (2004-12-20 16:49:00) [7]


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


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


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

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


ssk   (2004-12-20 16:48:00) [8]

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

то есть вот этот кусок вырезать
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;


ssk   (2004-12-20 16:46:00) [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;


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

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


DVM   (2004-12-20 16:40:00) [11]


> tradakad   (20.12.04 16:38) [6]

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


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

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


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

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


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


> ssk ©  

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


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

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


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


> ssk ©  

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


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

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


ssk   (2004-12-20 15:55:00) [16]

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

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


Digitman   (2004-12-20 15:55:00) [17]

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


Наверх

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