Главная страница
    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.035 c
14-1105807246
hamster
2005-01-15 19:40
2005.02.06
Кладовка


3-1105435225
edge
2005-01-11 12:20
2005.02.06
Записать текст в BLOB поле.


4-1102878566
MAINUSER
2004-12-12 22:09
2005.02.06
Получение буквы CD-ReWriter


11-1089331291
Vladimyr
2004-07-09 04:01
2005.02.06
Rotated text - не вращается, хоть тресни...


1-1106174256
ROMBLLER
2005-01-20 01:37
2005.02.06
как из dll вставить фрейм в форму программы...





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