Форум: "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