AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Editboxen in fremden Programmen suchen
Thema durchsuchen
Ansicht
Themen-Optionen

Editboxen in fremden Programmen suchen

Ein Thema von seddto1977 · begonnen am 2. Mai 2004 · letzter Beitrag vom 4. Mai 2004
Antwort Antwort
Seite 1 von 2  1 2      
seddto1977

Registriert seit: 15. Apr 2004
69 Beiträge
 
#1

Editboxen in fremden Programmen suchen

  Alt 2. Mai 2004, 18:35
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
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

Re: Editboxen in fremden Programmen suchen

  Alt 2. Mai 2004, 18:39
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.
Thomas
  Mit Zitat antworten Zitat
seddto1977

Registriert seit: 15. Apr 2004
69 Beiträge
 
#3

Re: Editboxen in fremden Programmen suchen

  Alt 2. Mai 2004, 18:42
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?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Editboxen in fremden Programmen suchen

  Alt 2. Mai 2004, 19:44
Moin Seddto,

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?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
seddto1977

Registriert seit: 15. Apr 2004
69 Beiträge
 
#5

Re: Editboxen in fremden Programmen suchen

  Alt 3. Mai 2004, 08:57
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
  Mit Zitat antworten Zitat
seddto1977

Registriert seit: 15. Apr 2004
69 Beiträge
 
#6

Re: Editboxen in fremden Programmen suchen

  Alt 3. Mai 2004, 09:52
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?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Editboxen in fremden Programmen suchen

  Alt 3. Mai 2004, 22:18
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
seddto1977

Registriert seit: 15. Apr 2004
69 Beiträge
 
#8

Re: Editboxen in fremden Programmen suchen

  Alt 4. Mai 2004, 07:32
@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?
  Mit Zitat antworten Zitat
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
seddto1977

Registriert seit: 15. Apr 2004
69 Beiträge
 
#10

Re: Editboxen in fremden Programmen suchen

  Alt 4. Mai 2004, 12:34
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:19 Uhr.
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