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

Вниз

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

 
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 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.041 c
1-1106291343
Павел
2005-01-21 10:09
2005.02.06
Как проверить работает ли пользователь под правами админа


3-1105054722
Ghost_
2005-01-07 02:38
2005.02.06
динамический SQL


14-1106207109
1008
2005-01-20 10:45
2005.02.06
IBM подарила open-source 500 патентов


14-1105980997
Никита
2005-01-17 19:56
2005.02.06
Отобразить дерево реестра


6-1100769845
Madrid
2004-11-18 12:24
2005.02.06
создание сетевого теста





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский