Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Editboxen in fremden Programmen suchen (https://www.delphipraxis.net/21412-editboxen-fremden-programmen-suchen.html)

seddto1977 2. Mai 2004 17:35


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

toms 2. Mai 2004 17:39

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.

seddto1977 2. Mai 2004 17:42

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?

Christian Seehase 2. Mai 2004 18:44

Re: Editboxen in fremden Programmen suchen
 
Moin Seddto,

Zitat:

Zitat von seddto1977
Wie kann ich denn feststellen ... 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?

Hast Du hier schon mal nach Hier im Forum suchenEnumWindows gesucht?

seddto1977 3. Mai 2004 07:57

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

seddto1977 3. Mai 2004 08:52

Re: Editboxen in fremden Programmen suchen
 
Hab jetzt noch ein Problem. Das ist der Code den ich jetzt geschrieben hab:


Code:
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;
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)

Weiss jemand wo der Fehler liegt?

Christian Seehase 3. Mai 2004 21:18

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.

seddto1977 4. Mai 2004 06:32

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?

Assarbad 4. Mai 2004 09:31

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:
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
Delphi-Quellcode:
FindAllChildsOfClass('MeineGesuchteKlasse');
reicht.

ABER ...
Zitat:

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.

seddto1977 4. Mai 2004 11:34

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:28 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz