Thema: X-Spy

Einzelnen Beitrag anzeigen

Benutzerbild von Motzi
Motzi

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

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