[delphi] zawartość nazw okien i sciezka do pliku

0

cześć

Próbuje sobie zrobić program, który pokaże mi wszystkie otwarte okna a do nich nazwę exe jeśli są programem

kod żeby pobrać listę otwartych okien

function EnumWindowsProc(wHandle: HWND): Boolean; StdCall; Export;
var title,className: array[0..128] of Char; sTitle,sClass,sLine: String;
begin
Result:=True;
GetWindowText(wHandle,title,128);
GetClassName(wHandle,className,128);
sTitle:=title;
sClass:=className;
if IsWindowVisible(wHandle)
then
begin
sLine:=sTitle;
Form1.memo1.Lines.add(sLine);
end;
end;


procedure TForm1.Button4Click(Sender: TObject);
begin
 EnumWindows(@EnumWindowsProc,0);
end;

Szukam w necie jak pobrać do tego nazwy exe ale z kiepskim skutkiem tzn znalazłem jak pobrać liste procesów itp ale <ort>w ogóle </ort>nie mam pojęcia jak pobrać nazwy exe do tej funkcji wyżej
Może się nie da??

proszę o pomoc

0

Wygooglowałem sposób na pobranie samej nazwy pliku Exe procesu (FullPath = False) lub też pełnej
ścieżeki do pliku Exe (FullPath = True). Przerobiłem ten kod, na taki jaki jest poniżej i działa poprawnie:
Link do oryginału: http://www.delphitricks.com/source-code/windows/get_exe_path_from_window_handle.html Do uses dodaj PsApi.

function ProcessFileName(PID: DWORD; FullPath : boolean): string;
var
Handle: THandle;
begin
Result := '';
Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID);
if Handle <> 0 then
try
SetLength(Result, MAX_PATH);
if FullPath then
begin
if GetModuleFileNameEx(Handle, 0, PChar(Result), MAX_PATH) > 0 then
SetLength(Result, StrLen(PChar(Result)))
else
Result := '';
end
else
begin
if GetModuleBaseNameA(Handle, 0, PChar(Result), MAX_PATH) > 0 then
SetLength(Result, StrLen(PChar(Result)))
else
Result := '';
end;
finally
CloseHandle(Handle);
end;
end;

function EnumWindowsProc(wHandle: HWND): Boolean; StdCall; Export;
var
PID : DWORD;
title, className: array[0..128] of Char;
sTitle, sClass, sLine, ExeName : string;
begin
Result := True;
GetWindowText(wHandle, title, 128);
GetClassName(wHandle, className, 128);
sTitle := title;
sClass := className;

GetWindowThreadProcessId(WHandle, @PID);
ExeName := ProcessFileName(PID, False);

if IsWindowVisible(wHandle)
then
begin
sLine := sTitle;
Form1.memo1.Lines.add(sLine + ' - ' + ExeName);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
EnumWindows(@EnumWindowsProc, 0);
end;

O to chodzi?

0
{Pobiera nazwę pliku (ścieżkę) na podstawie tytułu okna (uchwytu)}

uses
  TlHelp32, PSApi;

function PobierzNazwPlikuZOkna(Tytul: string): string;
var
 PID: DWORD;
 Handle: hWnd;
begin
 Result := '';
 Handle := FindWindow(nil, pchar(Tytul));
 if Handle = 0 then Exit;

 GetWindowThreadProcessId(Handle, @PID);
 Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID);
 if Handle <> 0 then
   try
     SetLength(Result, MAX_PATH);
     if GetModuleFileNameEx(Handle, 0, PChar(Result), MAX_PATH) > 0 then SetLength(Result, StrLen(PChar(Result)));
   finally
    CloseHandle(Handle);
   end;
end;
0

olesio dziękuje bardzo o to właśnie chodziło :)

mam kod jeszcze, że pobiera nazwy wszystkich uruchomionych procesów (bo właśnie widzę, że gdy program jest w trayu to juz nie pobiera nazwy jego i exe)i do tego spróbuje dodać nazwy okien z Twoim kodem już będzie lłatwiej

:)

Opi też dzięki tylko jeśli chodzi o takie funkcje i kod to ja zawsze mam problem jak to pokazać np w memo

0

ikonka programu w trayu to nadal uruchomiony proces :/ używasz IsWindowVisible(wHandle), programy w trayu często mają ukryte okna i to jest powód niepobierania nazwy itp.

0

LF wiem
ten kod pobiera nazwy okien, które są na pasku a nie w tray ... nie pobiera procesów :/

0

jeśli proces umieszcza ikonę w trayu, to musi stworzyć okno, żeby obsłużyć komunikaty z traya.
jak pobrać ściezkę do pliku, który stworzył proces - to napisał Opi.
a jeśli chodzi o enumerowanie procesów, które nie tworzą okien, to raczej nie zrobisz tego przez EnumWindows, nie sądzisz? Albo WMI, albo Toolhelp (CreateToolhelp32Snapshot).

0

ale można zminimalizować program, żeby był tylko widoczny w trayu koło zegarka systemowego np gg jeśli nie masz żadnej rozmowy otwartej to samo gg masz tylko koło zegarka i już ten kod Olesia nie pokaże gg

Wtedy pobiera się listę wszystkich procesów i gg będzie na tej liście ... dlatego napisałem, że muszę dopisać sobie aby pokazywało też listę procesów

0

omg... chłopie, po prostu nie sprawdzaj iswindowvisible!!! czy ty nie rozumiesz co robi ta funkcja???
jak dla przedszkolaka: jeśli aplikacja jest "schowana" do tray'a (to ten mały pasek obok zegarka), to jej okno nie jest widoczne. jeśli jej okno nie jest widoczne, to funkcja, która sprawdza czy okno jest widoczne zwróci - no zgadnij - false. jeśli w warunku jest false, to kod objęty tym warunkiem nie wykonuje się. jeśli tego nie rozumiesz to idź sprzedawać gazety zamiast "programować".

0

@maxi12: po prostu zrezygnuj z funkcji IsWindowVisible, zrób na przykład jak poniżej a pokąze i GG
albo inne procesy, które są w Trayu i nie mają widocznego okna, tak chyba będzie najłatwiej myślę.

function EnumWindowsProc(wHandle: HWND): Boolean; StdCall; Export;
var
PID : DWORD;
title, className: array[0..128] of Char;
sTitle, sClass, sLine, ExeName : string;
begin
Result := True;
GetWindowText(wHandle, title, 128);
GetClassName(wHandle, className, 128);
sTitle := title;
sClass := className;

GetWindowThreadProcessId(WHandle, @PID);
ExeName := ProcessFileName(PID, True);

sLine := sTitle;
Form1.Memo1.Lines.Add(sLine + ' - ' + ExeName);
end;

@LF: lepiej idź na tę imprezę po cięzkim tygodniu pracy, bo z nerwów zjesz te zęby z avatara :)

// może. głupota ludzka i tak mnie będzie denerwować - Ł

0

ŁF ale czy ty musisz narzucać swoje myśli ??? napisałem, że muszę zrobić 2 kod i chciałem skorzystać z procesów .... kod o widoczności okien potrzebuje do jednego programu a kod o procesach potrzebuje do drugiego programu ... nie chciałem wiązać ze sobą tych 2 rzeczy

Nie spytałeś do czego potrzebuje kodu z plikami w trayu!!!!

Olesio dzięki wielkie za pomoc

// niczego nie narzucam, podaję ci rozwiązanie twojego problemu, a ty go nie rozumiesz. Olesio zrobił ze swoim kodem to, co opisałem i wkleił ci to - "dzięki wielkie za pomoc", czyli o to właśnie ci chodziło. jesteś chyba mentalnie sprawny inaczej [glowa] - Ł

1 użytkowników online, w tym zalogowanych: 0, gości: 1