Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Определить имя файла процесса и наоборот???!!!


Автор: Nicholas 21.10.2004, 11:07
1. Вот так получаем список запущенных приложений:

procedure TForm1.Button1Click(Sender: TObject);
VAR
Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
begin
ListBox1.Clear;
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN {Hе показываем:}
IF (Wnd <> Application.Handle) AND {-Собственное окно}
IsWindowVisible(Wnd) AND {-Hевидимые окна}
(GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0)
THEN BEGIN
GetWindowText(Wnd, buff, sizeof(buff));
ListBox1.Items.Add(StrPas(buff));
END;
Wnd := GetWindow(Wnd, gw_hWndNext);
END;
ListBox1.ItemIndex := 0;
end;

Выполнив получаем примерно такое:

Документ1 – Microsoft Word

Windows Commander
……..

А надо что бы выводилось так:

Документ1 – Microsoft Word | Winword.exe

Windows Commander | Wincmd32.exe
………….

а лучше так:

Документ1 – Microsoft Word | c:\Program files\Microsoft Office\Office10\Winword.exe

Windows Commander | c:\WinCmd\Wincmd32.exe
………….

Покажите как такое организовать, желательно с помощью Win 32 API ???

2. Как получить HWnd по имени файла, к примеру у меня calc.exe имя файла и калькулятор запущен, мне надо найти окно созданное этой программой и закрыть его.
Только вот привязка должна быть к файлу, т.к. есть некоторые системные приложения у которых имена файлов разные, а classname одинаковые, при этом заголовок окна не известен?????

Собственно если на первый вопрос кто ответит, то второй не понадобиться, поставлю просто условие при получении classname проверят имя файла.

:sample

Автор: p0s0l 21.10.2004, 11:50
1) Этот способ не работает в 9x:
Код

uses PsApi;

var
 PID : DWORD;
 hProcess, hSnap : THandle;

...
 GetWindowThreadProcessId (wnd, PID);
 hProcess := OpenProcess (PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID);
 GetModuleFileNameEx (hProcess, 0, Buff, SizeOf(Buff));
 CloseHandle(hProcess);
// в Buff - имя исполняемого файла

Этот способ должен работать везде:
Код

uses TlHelp32;

var
 PID : DWORD;
 me32 : TModuleEntry32;
 hSnap : THandle

...
 GetWindowThreadProcessId (wnd, PID);
 hSnap := CreateToolHelp32Snapshot (TH32CS_SNAPMODULE, PID);
 me32.dwSize := SizeOf(me32);
 Module32First (hSnap, me32);
 CloseHandle (hSnap);
// в me32.szExePath - имя исполняемого файла


2) Как убить процесс, зная имя .exe (из DRKB):
Код

uses  
 Tlhelp32, Windows, SysUtils;  

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;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)