Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Window listing (https://www.delphipraxis.net/196362-window-listing.html)

Zodi 15. Mai 2018 22:10

Window listing
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Delphianer

Ich versuche mich gerade mit dem Window Listing.
Leider treten da bei mir folgende Effekte mit komischen Zeichen auf.

Anhang 49067

Der code dazu schaut so aus...

Delphi-Quellcode:
function GetClass(Handle: integer): string;
var
  Buf: array[0..255] of char;
begin
  GetClassName(Handle,Buf,255);
  Result := Buf;
end;

function HandleToPid(Handle: integer): integer;
var
  PID: dword;
begin
  GetWindowThreadProcessId(Handle,Pid);
  Result := Pid;
end;

function PidToPath(Pid: integer): string;
var
  ProcessHandle: THandle;
  Buf: array[0..MAX_PATH] of char;
begin
  ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,  false,Pid);
  GetModuleFileNameEx(ProcessHandle,0,Buf,MAX_PATH);
  Result := String(Buf);
  CloseHandle(ProcessHandle);
end;

function GetCaption(Handle: integer): string;
var
  Buf: array[0..255] of char;
begin
  GetWindowText(Handle,Buf,255);
  Result := Buf;
end;

function eWindows(Handle: integer; Num: Integer): bool; stdcall;
var
  IncludeHidden: string;
  IncludeVisible: string;
begin
  IncludeVisible := inttostr(Num);

  IncludeHidden := copy(IncludeVisible,1,1);
  Delete(IncludeVisible,1,1);

  if IncludeVisible = '1' then if iswindowvisible(Handle) then begin
    WindowListing := WindowListing + inttostr(Handle) + '|' + GetCaption(Handle) + '|' + GetClass(Handle) + '|' + PidToPath(HandleToPid(Handle)) + '|' + inttostr(HandleToPid(Handle)) + #13#10;
  end;

  if IncludeHidden = '1' then if not iswindowvisible(Handle) then begin
    WindowListing := WindowListing + inttostr(Handle) + '|' + GetCaption(Handle) + '|' + GetClass(Handle) + '|' + PidToPath(HandleToPid(Handle)) + '|' + inttostr(HandleToPid(Handle)) + #13#10;
  end;

  Result := True;
end;

function WindowList(Number: string): string;
begin
  WindowListing := '';
  EnumWindows(@eWindows,strtoint(number));
  Result := WindowListing;
end;
Was hat das mit den komischen Zeichen auf sich?

Grüsse Zodi

Dalai 15. Mai 2018 22:36

AW: Window listing
 
Die fragliche/markierte Spalte wird durch die Funktion PidToPath befüllt, richtig? Diese Funktion kann bzw. sollte (oder gar muss) in mehrfacher Hinsicht überarbeitet/verbessert werden: Lokale Variablen immer initialisieren, Arrays sauber nullen (z.B. ZeroMemory oder FillChar). Außerdem sollte man Rückgabewerte von Funktionen auswerten, wo immer möglich und nötig - in diesem Fall fehlt das bei GetModuleFileNameEx und auch OpenProcess. Ich vermute einfach mal, dass das Öffnen des Prozesses fehlschlägt oder der Modulname nicht ermittelt werden kann - aber das bekommst du ja durch saubere Auswertung der Funktionsrückgaben raus ;).

Grüße
Dalai

p80286 15. Mai 2018 22:45

AW: Window listing
 
Warum verarbeitest Du den Rückgabewert von
Delphi-Quellcode:
GetModuleFileNameEx
nicht?
Sollte er 0 sein steht im Buffer nichts verwertbares.

https://msdn.microsoft.com/en-us/lib...98(VS.85).aspx

Gruß
K-H

Edith:
Da hat der rote Kasten wohl schon Nachtruhe.

himitsu 16. Mai 2018 08:33

AW: Window listing
 
Jupp, das Wichtigste wurde hier überall konsequent vergessen.
Die Prüfung der Rückgabewerte sämtlicher WinAPI-Aufrufe.

Da fällt dann bestimmt auf, dass hier und da eine API nichts in den Buffer schreibt und somit der Inhalt auf Zufallswerten stehen täte, die schonmal wie chinesisches Kauderwelsch aussehn.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz