Einzelnen Beitrag anzeigen

Assarbad
(Gast)

n/a Beiträge
 
#9

Re: Editboxen in fremden Programmen suchen

  Alt 4. Mai 2004, 10:31
So, hab da mal drüber geschaut und das ganze als CONSOLEAPP implementiert. Leichte Veränderungen sind drin ...

Download mit EXE:
http://assarbad.net/stuff/temp/findall.rar
http://assarbad.net/stuff/temp/findall.zip
(Hängt auch noch mal am Beitrag dran, falls ich es mal von meinem Webspace entferne )

Delphi-Quellcode:
function EnumChildWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
var
  searchclass,
    wndclass,
    email,
    email2: string;
begin
// Continue enumeration
  Result := True;
// Typecast parameter lParam from Integer to PChar and then copy into String var
  SetString(searchclass, PChar(lParam), lstrlen(PChar(lParam)));
// Get text of child window
  wndclass := GetClassNameFromWndA(hWnd);
// Compare case insensitive
  if Pos(Uppercase(searchclass), Uppercase(wndclass)) > 0 then
  begin
    Writeln(' -> ', wndclass); // <--- DEBUGGING
{
    email := GetTextFromWndA(hWnd);
    if (Pos('@', email) > 0) and (Pos('.', email) > Pos('@', email)) then email_schreiben(email);
    if (Pos('@', email) > 0) then
    begin
      email2 := email;
      Delete(email2, 1, Pos('@', email2) - 1);
      if Pos('.', email2) > Pos('@', email2) then email_schreiben(email);
    end;
}

  end;
end;

function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
begin
// Continue enumeration
  Result := True;
// This is probably obsolete!
  if IsWindow(hWnd) then
  begin
// Enumerate child windows of hWnd ...
    Writeln(Format('* %8.8X', [hwnd])); // <--- DEBUGGING
    EnumChildWindows(hWnd, @EnumChildWindowsProc, lParam);
  end;
end;

procedure FindAllChildsOfClass(SearchClass: PChar);
begin
  EnumWindows(@EnumWindowsProc, LPARAM(SearchClass));
end;
Ein Aufruf ala
FindAllChildsOfClass('MeineGesuchteKlasse'); reicht.

ABER ...
Zitat von seddto1977:
Beim Einzelschritt durchlauf der Proceduren habe ich festgestellt, das offenbar auch nicht alle geöffneten Windows-fenster durchlaufen werden , sondern nur 1 oder 2 oder so. Es kommt nämlich immer die gleiche Anordnung von Elementen ("BUTTON", "SYSTRAY"....usw und wieder von vorne)

Weiss jemand wo der Fehler liegt?
Eins muß ich aber noch bemerken, Du hast bei den Callback frisch-fröhlich den Parameter lParam unterschlagen ... sollte man nicht machen - deshalb werden Prototypen ja im PSDK angegeben!
Wenn die Anzahl der Parameter nicht stimmt, wird auch der Rückgabeparameter (hier ein BOOL) nicht korrekt ausgewertet und damit weiß das System nicht, daß du True zurückgegeben hast (zum fortfahren) sondern bekommt zB Null = False zurück.

In EnumChildWindowsProc habe ich den Teil, wofür ich keine Funktionen hatte auskommentiert.
Funktionen die hier aufgerufen sind, aber nicht zu sehen sind sind in der ZIP/RAR enthalten.

Nachtrag:
Die Ausgabe sieht etwa wie folgt aus ... nur um zu zeigen, daß es tatsächlich funktioniert.
Code:
* 00010488
* 00030464
* 00020470
* 000A043C
* 00220240
* 00020542
* 0006042A
* 000104CA
  -> TComboBox
* 000104D8
  -> TComboBox
  -> TComboBox
* 000104C4
* 00030450
* 00030448
* 00030446
* 0003044E
* 0005044C
* 00030404
* 0022026A
  -> ComboBox
  -> ComboBox
  -> ComboBox
* 000303BE
* 000C02E6
Oliver

PS: Die beiden Zeilen mit <--- DEBUGGING solltest du vor einer Wiederverwendung entfernen oder auskommentieren.
Angehängte Dateien
Dateityp: zip findall.zip (24,5 KB, 28x aufgerufen)
  Mit Zitat antworten Zitat