Delphi-PRAXiS
Seite 6 von 8   « Erste     456 78      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   X-Spy (https://www.delphipraxis.net/931-x-spy.html)

toms 25. Nov 2004 18:07

Re: X-Spy
 
Hi motzi

Habe gerade ein kleines Problem beim "Create FindWindow-Code" entdeckt.
Wenn der Titel/Text ein ' enthält, wird der FindWindow Code nicht richtig erstellt.
Es müsste also 2 '' haben.

Zitat:

var
wnd: HWND;
begin
wnd := FindWindow('MozillaWindowClass', 'Torry's Delphi Pages - Mozilla Firefox');

if wnd <> 0 then
begin

end;
end;
Dann eine andere Frage:

Beim Starten kommmt folgende Meldung:

Zitat:

Couldn't enable Debug-Privilege! Some informations won't be available!
Welche Infos betrifft das?

mfg

Motzi 25. Nov 2004 19:04

Re: X-Spy
 
Zitat:

Zitat von toms
Habe gerade ein kleines Problem beim "Create FindWindow-Code" entdeckt.
Wenn der Titel/Text ein ' enthält, wird der FindWindow Code nicht richtig erstellt.
Es müsste also 2 '' haben.

Zitat:

var
wnd: HWND;
begin
wnd := FindWindow('MozillaWindowClass', 'Torry's Delphi Pages - Mozilla Firefox');

if wnd <> 0 then
begin

end;
end;

Stimmt, das hab ich nicht beachtet.. Danke, wird sofort ausgebesser! :)

Zitat:

Dann eine andere Frage:

Beim Starten kommmt folgende Meldung:

Zitat:

Couldn't enable Debug-Privilege! Some informations won't be available!
Welche Infos betrifft das?

mfg
Betrifft hauptsächlich Infos über Prozesse und Threads die nicht im Security-Kontext des jeweiligen Users laufen (zB Services). Infos die nicht ermittelt werden können werden immer als "(Unavailable)" dargestellt.

Als Admin solltest du aber das Debug-Privilege haben, aber falls du eben nicht mit dem Admin-Konto arbeitest kannst du über die Lokale Sicherheitsrichtlinie einstellen welche User das Debug-Privileg haben.

Das "Problem" mit dem Debug-Privilege wird aber irgendwann (in wahrscheinlich etwas fernerer Zukunft) ein Ende haben, da ich schon seit längerem ein neues Konzept plane, die Umsetzung wird nur leider doch noch etwas länger dauern..!

toms 25. Nov 2004 19:14

Re: X-Spy
 
Zitat:

Das "Problem" mit dem Debug-Privilege wird aber irgendwann (in wahrscheinlich etwas fernerer Zukunft) ein Ende haben, da ich schon seit längerem ein neues Konzept plane, die Umsetzung wird nur leider doch noch etwas länger dauern..!
Ok, bin gespannt darauf...
Dennoch sollte jetzt die "No Debug-Privilege" Meldung nicht bei jedem Start kommen, denn
nach der 1. Meldung weiss man's... :wink:

Habe noch einen weiteren Fehler im FindWindow Code gefunden:

Fensterstruktur:

Delphi-Quellcode:
1770508: TAppBuilder "Delphi 6 - Project1"
  1967222: TControlBar
    1311916: TDockToolBar "Standard"
Generierter FindWindow Code von XSpy:

Delphi-Quellcode:
var
  wnd: HWND;
begin
  wnd := FindWindow('TAppBuilder', 'Delphi 6 - Project1');
  wnd := FindWindowEx(wnd, 0, 'TControlBar', nil);
  wnd := FindWindowEx(wnd, 0, 'TDockToolBar', 'Standard');

  if wnd <> 0 then
  begin

  end;
end;
TDockToolBar wird nicht gefunden, warum?

Die Antwort auf die Frage überlasse ich dir...

Motzi 25. Nov 2004 23:05

Re: X-Spy
 
Zitat:

Zitat von toms
Ok, bin gespannt darauf...

Das ganze läuft dann über einen COM-Server.. dauert aber wie gesagt sicher noch länger..!

Zitat:

Dennoch sollte jetzt die "No Debug-Privilege" Meldung nicht bei jedem Start kommen, denn
nach der 1. Meldung weiss man's... :wink:
Ja, ich hab mir schon gedacht, dass ich eine Checkbox "Don't show this message again" einbau...

Zitat:

Habe noch einen weiteren Fehler im FindWindow Code gefunden:

Fensterstruktur:

Delphi-Quellcode:
1770508: TAppBuilder "Delphi 6 - Project1"
  1967222: TControlBar
    1311916: TDockToolBar "Standard"
Generierter FindWindow Code von XSpy:

Delphi-Quellcode:
var
  wnd: HWND;
begin
  wnd := FindWindow('TAppBuilder', 'Delphi 6 - Project1');
  wnd := FindWindowEx(wnd, 0, 'TControlBar', nil);
  wnd := FindWindowEx(wnd, 0, 'TDockToolBar', 'Standard');

  if wnd <> 0 then
  begin

  end;
end;
TDockToolBar wird nicht gefunden, warum?

Die Antwort auf die Frage überlasse ich dir...
Hab mal bisschen rumprobiert und festgestellt, dass das an den FindWindow(Ex)-APIs liegt.. hab mir jetzt mal meinen eigenen Ersatz geschrieben, mit dem gehts:
Delphi-Quellcode:
function XSpy_FindWindowEx(WndParent: HWND; WndChildAfter: HWND;
  lpszClass: PChar; lpszWindow: PChar): HWND;

type
  TEnumWndRec = record
    lpszClass: PChar;
    lpszWindow: PChar;
    Wnd: HWND;
    WndParent: HWND;
    WndChildAfter: HWND;
    bChildFound: Boolean;
  end;

var
  aEnumWndRec: TEnumWndRec;

  function GetClassName(Wnd: HWND): String;
  var
    szBuffer: array [0..255] of Char;
  begin
    ZeroMemory(@szBuffer, SizeOf(szBuffer));
    Windows.GetClassName(Wnd, szBuffer, SizeOf(szBuffer));
    Result := String(szBuffer);
  end;

  function GetWindowText(Wnd: HWND): String;
  var
    dwResult: DWord;
    pBuffer: PChar;
  begin
    dwResult := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0) + 1;
    pBuffer := GetMemory(dwResult);
    try
      SendMessage(Wnd, WM_GETTEXT, dwResult, Integer(pBuffer));
      Result := String(pBuffer);
    finally
      FreeMemory(pBuffer);
    end;
  end;

  function EnumCallBack(Window: HWND; var aRec: TEnumWndRec): Boolean; stdcall;
  var
    bMatches: Boolean;
  begin
    Result := True;

    if (aRec.WndParent <> 0) and
      (aRec.WndParent <> GetAncestor(Window, GA_PARENT)) then
      Exit;
     
    if (aRec.WndChildAfter <> 0) and not aRec.bChildFound then
    begin
      aRec.bChildFound := aRec.WndChildAfter = Window;
      Exit;
    end;

    bMatches := True;
    if Assigned(aRec.lpszClass) then
      bMatches := String(aRec.lpszClass) = GetClassName(Window);

    if bMatches and Assigned(aRec.lpszWindow) then
      bMatches := String(aRec.lpszWindow) = GetWindowText(Window);

    if bMatches then
    begin
      aRec.Wnd := Window;
      Result := False;
    end;
  end;

begin
  Result := 0;
  if (WndParent <> 0) and not IsWindow(WndParent) then
    Exit;

  aEnumWndRec.lpszClass := lpszClass;
  aEnumWndRec.lpszWindow := lpszWindow;
  aEnumWndRec.Wnd := 0;
  aEnumWndRec.WndParent := WndParent;
  aEnumWndRec.WndChildAfter := WndChildAfter;
  aEnumWndRec.bChildFound := False;
  if WndParent = 0 then
    EnumWindows(@EnumCallBack, Integer(@aEnumWndRec))
  else
    EnumChildWindows(WndParent, @EnumCallBack, Integer(@aEnumWndRec));

  Result := aEnumWndRec.Wnd;
end;
PS: ich hab mal geschaut was dein WinSpy für einen Code für genau dieses Fenster produziert... der generierte Code findet zwar ein Fenster, aber das falsche..! ;) Das gesuchte Fenster hat ChildNr 6 statt 5...

toms 26. Nov 2004 05:41

Re: X-Spy
 
Zitat:

Zitat von Motzi
PS: ich hab mal geschaut was dein WinSpy für einen Code für genau dieses Fenster produziert... der generierte Code findet zwar ein Fenster, aber das falsche..! Wink Das gesuchte Fenster hat ChildNr 6 statt 5...

Oops, da muss ich wohl auch nochmals hinter die Bücher, äh den Code...

Zitat:

Hab mal bisschen rumprobiert und festgestellt, dass das an den FindWindow(Ex)-APIs liegt.. hab mir jetzt mal meinen eigenen Ersatz geschrieben, mit dem gehts:
Genau. Der FindWindowEx() Funktion sollte für lpszWindow nil übergeben, wenn sie
Childfenster in einem anderen Prozess (ausser explorer.exe) sucht.

Grund: FindWindowEx vergleicht bei Angabge von lpszWindow die Übereinstimmung des FensterNamens (lpszWindow) mittels GetWindowText, welche aber nicht zuverlässig ChildFenster Text in einem anderen Prozess ermitteln kann

Zu deiner "XSpy_FindWindowEx" Funktion:

Funktioniert so wohl sicher aber es man könnte es auch nur mit FindWindowEx() lösen, dann wäre der Source Code nur ein paar Zeilen lang.

Motzi 26. Nov 2004 10:48

Re: X-Spy
 
Zitat:

Zitat von toms
Genau. Der FindWindowEx() Funktion sollte für lpszWindow nil übergeben, wenn sie
Childfenster in einem anderen Prozess (ausser explorer.exe) sucht.

Grund: FindWindowEx vergleicht bei Angabge von lpszWindow die Übereinstimmung des FensterNamens (lpszWindow) mittels GetWindowText, welche aber nicht zuverlässig ChildFenster Text in einem anderen Prozess ermitteln kann

Genau genommen nicht nur FindWindowEx, sondern auch FindWindow:
Zitat:

Zitat von PSDK
If the lpWindowName parameter is not NULL, FindWindow calls the GetWindowText function to retrieve the window name for comparison. For a description of a potential problem that can arise, see the Remarks for GetWindowText.

Daher werd ich wohl bei meinem FindWindow(Ex)-Ersatz bleiben, auch wenn der Code dadurch länger wird..

Motzi 1. Dez 2004 23:38

Neue Release v0.6.5.215
 
Neue Release v0.6.5.215

Änderungen:
  • ein paar Window-Informationen hinzugefügt (Icons, Window Properties)
  • einige Prozess-Informationen hinzugefügt (Service-Liste)
  • Hot-Key-Unterstützung für Window-Finder-Tool
  • einige Bugs und Speicher-Lecks gefixt
  • ein paar Kleinigkeiten geändert/hinzugefügt
Download: klick


Und nachdem mehrmals die Frage aufgetaucht ist - Was ist X-Spy - hier jetzt mal eine Erklärung ;)

X-Spy ist ein Projekt, das sich zum Ziel gesetzt hat, die Programme Spy++ [Microsoft] und Winsight [Borland] in Möglichkeiten und Detailreichtum noch zu übertreffen!

Für alle die diese beiden Programme nicht kennen - mit ihnen ist es möglich alle Fenster des Systems hierachisch mitsamt ihren Child-Fenstern aufzulisten und umfangreiche Informationen wie Handle, Text, Klassenname, etc. jedes einzelnen Fensters zu bekommen. Weiters kann man mit dem X-Spy alle Prozesse mit ihren abgespalteten Threads und den darin erzeugten Fenstern auflisten. Ebenso gibt es eine reine Thread-Liste, eine Modul-Liste mit allen im System geladenen Modulen und eine Service-Liste. Zu jedem Objekt-Art (Fenster, Prozess, Thread, Modul, Service) kann man sich umfangreiche Informationen anzeigen lassen - man erhält also einen recht guten Überblick was sich im System so alles tut.

Und für alle die gerne fremde Steuerelemente manipulieren kann man sich für jedes beliebige Fenster den FindWindow-Code generieren lassen (dieses Feature ist leider noch nicht 100%ig ausgereift). :)

Bitte um Feedback!! :)

Motzi 6. Dez 2004 10:11

Re: X-Spy
 
*push*

Kommt schon Leute, gibt es denn wirklich keinen den das Prog interessiert? :? Auch Leute die von älteren verbuggten Versionen entsetzt waren könnten sich ruhig mal an die neue Version rantrauen - es hat sich einiges getan..!

Ich will doch nur ein bisschen Feedback - ihr seid doch sicher auch froh wenn sich jemand eure Progs anschaut!

perle 6. Dez 2004 10:58

Re: X-Spy
 
also ich fand die Alte Version schon nicht schlecht, ich guck mir mal die neue an jetz :)

:coder2:

mirage228 6. Dez 2004 11:48

Re: X-Spy
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Motzi,

hab mir die Version mal angeschaut und habe 2 kleine Bugs gefunden ;)
  • Man kann ein Fenster in das X-Spy Fenster reinschieben (das ist nicht gewollt oder?) [s. Anhang]
  • Wenn ich auf der Taskleiste rechtsklicke und "Desktop anzeigen" wähle verschwindet das X-Spy Fenster und tauch nicht von alleine wieder auf, aber der Platz oben bleibt besetzt (Man muss im Taskleistenmenü "Alle geöffneten Fenster anzeigen" wählen, um das X-Spy Fenster wieder anzuzeigen.

Ansonsten wirklich ein super Programm :thumb:

mfG
mirage228


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:40 Uhr.
Seite 6 von 8   « Erste     456 78      

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