Autor Beitrag
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 16.08.17 18:59 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Richtig, in der GetSpecificWindowCaption() Methode haben wir die Funktion EnumWindows() aufgerufen. EnumChildWindows() ist wiederum etwas anderes, wie der Name schon sagt.
Wer lesen kann, ist klar im Vorteil! :mrgreen:

Nein danke, das ist mir zu kompliziert:
Win API Hilfe hat folgendes geschrieben:
Die Funktion EnumChildWindows zählt die untergeordneten Fenster des festgelegten übergeordneten Fensters auf, indem das Handle jedes untergeordneten Fensters an die anwendungsunterstützte Callback-Funktion übergeben wird.
[...]
WndParent Legt das übergeordnete Fenster fest, dessen untergeordnetes Fenster aufgelistet werden sollen.
EnumFunc Ist die Adresse der Callback-Funktion. Diese Adresse muß mit Hilfe der Funktion MakeProcInstance erzeugt worden sein. [...]
lParam Legt den Wert fest, der an die Callback-Funktion zur Verwendung in der Anwendung übergeben wird. [...]
[...]
Diese Funktion listet nicht obenliegende Fenster, die zu dem übergeordneten Fenster gehören, auf.
Hat ein Sekundär-Fenster eigene Sekundär-Fenster erzeugt, listet die Funktion diese Fenster ebenfalls auf.
Ein Sekundär-Fenster, das während des Auflistungsprozesses in der Z-Richtung bewegt oder repositioniert wird, wird korrekt aufgelistet. Die Funktion listet ein Sekundär-Fenster, das zerstört wird, bevor es erfaßt wird, oder das während des Auflistungsprozesses erzeugt wird, nicht auf.

Was ist unter Windows das "festgelegte übergeordnete Fenster"? Hier also wohl der Desktop. Wie komme ich an das Handle des Desktops? Wie erhalte ich die anderen Parameter?
Ich mache hier Schluss. :eyecrazy:

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 16.08.17 19:19 
- Nachträglich durch die Entwickler-Ecke gelöscht -
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 16.08.17 19:37 
Mit EnumChildWindows(hWnd(0), @GetAllWindows, Integer(tmp)); kompiliert es zwar, aber mit dem gleichen Effekt: Nur im aufrufende Fenster finden irgendwelche Änderungen zB. in TEdit statt.
Der Aufruf sieht so aus: SendText2('Form1''TEdit''Neuer Edit-Text');

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 16.08.17 20:00 
- Nachträglich durch die Entwickler-Ecke gelöscht -
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 16.08.17 20:56 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
hWnd(0) sieht merkwürdig aus, allein schon wegen den runden Klammern.
Ja, es wird aber ein (Integer-)Wert verlangt. Welcher? Keine Ahnung, hab's halt mit 0 versucht!
Ohne Wert in Klammern gibt Delphi die Meldung "[dcc32 Fehler] [...]: E2029 '(' erwartet, aber ',' gefunden" aus.

EnumChildWindows erwartet andererseits als ersten Parameter hWndParent: HWND, also verstehe ich nicht, warum da ein Wert in Klammern verlangt wird...

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 16.08.17 21:05 
- Nachträglich durch die Entwickler-Ecke gelöscht -
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 16.08.17 21:17 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Da wird auch kein Wert in Klammern verlangt, sonder das Handle des jeweiligen Anwendung-Fensters. :D
Also könnte man vorerst zum Testen einfach Application.MainForm.Handle angeben, oder auch gleich dieses Handle mit übergeben? Ja? - Hab ich gemacht (SendText2(Handle, 'Form1''TEdit''Neuer Edit-Text');), und jetzt passiert wieder gar nichts. Klarerweise kommt Handle auch bei Prozedur GetSpecificWindowCaption an und wird dort verwertet:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure GetSpecificWindowCaption(aHandle: THandle; const AList: TStrings; const SubText: string;
  bHandle: Boolean);
var
  tmp: TStringList;
  i: Integer;
begin
//...
EnumChildWindows(aHandle, @GetAllWindows, Integer(tmp));
//...

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 17.08.17 19:48 
Ich habe mir jetzt eine Funktion GetHandle gebaut:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function GetHandle(const SubText: string): THandle;
var
  aHandle: THandle;
begin
  aHandle := FindWindow(nil, PChar(SubText));

  if aHandle <> 0 then
    Result := FindWindowEx(aHandle, 0, PChar(ControlClassName), PChar(SubText))
  else
    Result := 0;
end;


Die rufe ich für EnumChildWindows so auf:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
begin  {GetSpecificWindowCaption}
  if (AList <> niland (SubText <> ''then
  begin
    tmp := TStringList.Create;
    try
      aHandle := GetHandle(SubText);
      EnumChildWindows(aHandle, @GetAllWindows, Integer(tmp));

Mit dem Ergebnis, dass es immer noch nur bei genau dem aufrufenden Fenster funktioniert, bei anderen nicht, da ist es nach wie vor nil. :autsch:

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!