![]() |
Editboxen in fremden Programmen suchen
Ich bin dabei ein kleines Mail-Programm zu schreiben und möchte folgendes Feature noch hinzufügen:
Das Programm soll alle anderen geöffneten Windowsfenster(wenn der user diese Option gewählt hat) nach editboxen durchsuchen und dann überprüfen ob in der editbox zb ein text steht der ein @ enthält (also eine Email-Adresse) Dann soll das Programm die Adresse aus der fremden Editbox auslesen und den User fragen ob die Email-Adresse zum Adressbuch hinzugefügt werden soll. hat jemand sowas schonmal gemacht und kann mir sagen wie das mit Findwindow oder Enumwindows geht? Danke & LG Seddto |
Re: Editboxen in fremden Programmen suchen
Hi,
Mit EnumWindows() kannst du alle Toplevel-Fenster durchlaufen. Dann rufst du für jedes einzelne Fenster EnumChildWindows auf. Dies liefert dir dann Handles zu Windows Controls. Nit GetClassName() ermittelst du dann den Klassennamen des Controls. Mit SendMessage + WM_GETTEXT kannst du den Text des Controls auslesen. |
Re: Editboxen in fremden Programmen suchen
Danke für die Antwort. Wie kann ich denn feststellen wenn ich die Objekte eines Fensters durchlaufe , das ich es gerade mit einer Edit-Box und nicht etwa mit einem Button oö. zu tun habe?
Edit// Wie krieg ich denn mit enumwindows das Handle des Fensters? Hat da jemand mal ein CodeBeispiel? |
Re: Editboxen in fremden Programmen suchen
Moin Seddto,
Zitat:
![]() |
Re: Editboxen in fremden Programmen suchen
Hi Christian :)
Ja hab ich gerade, aber die Frage wie ich herausbekomme ob ich es mit einer Editbox zu tun habe wird dort leider nicht beantwortet |
Re: Editboxen in fremden Programmen suchen
Hab jetzt noch ein Problem. Das ist der Code den ich jetzt geschrieben hab:
Code:
Aber es werden keine Editboxen gefunden. Ich habe extra ein von mir geschriebenes Programm geöffnet in dem eine Editbox drin ist aber die wird nicht gefunden. 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)
function EnumWindowsProc(wHandle: HWND): Bool; stdcall;
var Title, ClassName: array[0..255] of char; begin Result := True; GetWindowText(wHandle, Title, 255); GetClassName(wHandle, ClassName, 255); if IsWindow(wHandle) then EnumChildWindows(wHandle, @EnumProc, 0); end; function EnumProc(wnd: HWND): BOOL; stdcall; var buffer, buf, Caption: array[0..255] of char; classe, email, email2: String; begin Result := True; GetClassName(wnd, buf, SizeOf(buf) - 1); classe := uppercase(buf); If Pos('EDIT', classe) > 0 then begin SendMessage(Wnd, WM_GETTEXT, sizeof(buffer), Integer(@buffer)); email := buffer; 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; Weiss jemand wo der Fehler liegt? |
Re: Editboxen in fremden Programmen suchen
Moin Seddto,
die aufgerufenen Unterfunktionen habe beide zwei Parameter. Du hast sie jeweils mit einem deklariert. Wenn Du ein selbstgeschriebenes Delphiprogramm nimmst, kommt es darauf an, wie Du es gemacht hast, um die Klasse EDIT finden zu können. Standard bei Delphi wäre der Klassenname TEdit. |
Re: Editboxen in fremden Programmen suchen
@Christian
Danke für die Antwort. Ja das mit Tedit weiss ich. Das Problem ist aber, das ich das Programm ja in alle laufenden Windows Programmen nach edit-boxen suchen lassen will, so das ich also nicht vorher weiss ob es in Delphi oder einer anderen Sprache geschrieben wurde. Deshalb habe ich ja auch nach dem Teilstring "EDIT" suchen lassen. Müsste das nicht auch funktionieren wenn der Klassenname "TEDIT" ist. Ich hab die beiden Unterprogramme mal im Einzelschritt durchlaufen lassen und dabei die Variable für Klassennamen mal zur Watch-Liste hinzugefügt um zu sehen, was denn da so gefunden wird. Wie gesagt, ich hatte den Eindruck das garnicht alle Windows-Fenster durchlaufen wurden, da sich die Reihenfolge der gefundenen Klassen sehr schnell wiederholte und obwohl mein Delphi-Programm mit Editbox auf war keine Klasse Edit oder Tedit gefunden wurde..Weiss jemand woran das liegen könnte? Welcher Pramameter fehlt denn bei meinem Funktionsaufruf? |
Re: Editboxen in fremden Programmen suchen
Liste der Anhänge anzeigen (Anzahl: 1)
So, hab da mal drüber geschaut und das ganze als CONSOLEAPP implementiert. Leichte Veränderungen sind drin ...
Download mit EXE: ![]() ![]() (Hängt auch noch mal am Beitrag dran, falls ich es mal von meinem Webspace entferne ;))
Delphi-Quellcode:
Ein Aufruf ala
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;
Delphi-Quellcode:
reicht.
FindAllChildsOfClass('MeineGesuchteKlasse');
ABER ... Zitat:
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:
Oliver
* 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 PS: Die beiden Zeilen mit <--- DEBUGGING solltest du vor einer Wiederverwendung entfernen oder auskommentieren. |
Re: Editboxen in fremden Programmen suchen
Hi Assarbad,
Muss echt tausend mal Danke sagen das du dir die ganze Arbeit gemacht hast! :) Werd das jetzt gleich mal probieren! Liebe grüsse, seddto |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 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 by Thomas Breitkreuz