AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

X-Spy

Ein Thema von Motzi · begonnen am 27. Sep 2002 · letzter Beitrag vom 5. Mai 2008
Antwort Antwort
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#1

Re: X-Spy

  Alt 25. Nov 2004, 23:05
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...
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...
Manuel Pöter
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz