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.