![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать запущено ли приложение? Подскажите функцию [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]любыми ф-циями, предназначенными для открытия файла с правами на запись