Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   FindMemo, FindEdit (https://www.delphipraxis.net/191661-findmemo-findedit.html)

derseitzer 7. Feb 2017 16:54

FindMemo, FindEdit
 
Hallo Leute :wink: ,
ich habe (aus Testzwecken) zwei von sich unabhängige Delphiprogramme.
Ziel: auf Programm eins per Buttonklick einen Text in ein Editfeld oder Memo des zweiten Programms schreiben.
bin bereits bei dem Editfeld gescheitert und habe diese Codes probiert:
Randinformationen: -Ich weiß, dass der Fehler hierbei im Code steckt den ich hier schreibe. -Mein TEdit im Programm 2 heißt 'TextFeld'. -Appl2 ist auch korrekt, kann nicht daran liegen.
var
hbtn: Thandle;
[...]
in Prozedur:
hbtn:= FindWindowex(Appl2,0,nil,'Textfeld');
hbtn:= FindWindowex(Appl2,0,'Textfeld',nil);

Kurze und knappe Frage: wie findet er mein Textfeld :)? und wäre es ähnlich bei einem Memo?:)
Danke im voraus :)

EWeiss 7. Feb 2017 17:06

AW: FindMemo, FindEdit
 
Appl2.. Ist definitiv nicht das Handle des Edit, Memo.
Schau dir doch mal die Definition von FindWindowEx an.

gruss

derseitzer 7. Feb 2017 17:12

AW: FindMemo, FindEdit
 
appl2 ist der Parameter für mein zweites programm (application2) oder oft auch hwnd..
(Appl2 := FindWindow(nil, 'FormvonProgramm2');
aber wie gesagt.. daran liegt der Fehler nicht..
meine appl2 findet er aber mein 'Textfeld' nicht..

EWeiss 7. Feb 2017 17:21

AW: FindMemo, FindEdit
 
Zitat:

Zitat von derseitzer (Beitrag 1361041)
appl2 ist der Parameter für mein zweites programm (application2) oder oft auch hwnd..
(Appl2 := FindWindow(nil, 'FormvonProgramm2');
aber wie gesagt.. daran liegt der Fehler nicht..
meine appl2 findet er aber mein 'Textfeld' nicht..

Klar liegt der Fehler daran. Wo sonst?

1. Fenster (Child) enumerieren alle ChildWindows die sich auf der anderen Anwendung befinden.
2. Nachdem das korrekte Handle des Edit Feld gefunden wurde anhand seines Classen Namen "TEdit" zu 3
3.Beispiel: Text senden.

Delphi-Quellcode:
SendMessage(MeinEditHandle, WM_SETTEXT, 0, textstring);


Es nutzt dir gar nichts wenn du das Handle der Anwendung verwendest um eine Message an ein ChildWindow dieser Anwendung (In dem Fall TEdit) zu senden
ohne das Handle des besagten zu kennen.

gruss

derseitzer 7. Feb 2017 17:31

AW: FindMemo, FindEdit
 
Vielleicht hätte ich mehr Code zeigen sollen tut mir Leid..
Code:
Appl2 := FindWindow(nil, 'FormvonProgramm2');
if Appl2 <> 0 then                               //klappt:)
begin
  hbtn:= FindWindowex(Appl2,0,nil,'Textfeld');
    if hbtn<>0 then                              //klappt nicht:(... edit nicht gefunden.
    begin
    SendMessage(hbtn, WM_SETTEXT, 0, Textstring);
    end
  else showmessage('Edit nicht gefunden');
end
else showmessage ('appl2 nicht gefunden');
Mein Programm kommt garnicht zum Senden des Textes, da er das Edit nicht findet..

EWeiss 7. Feb 2017 17:35

AW: FindMemo, FindEdit
 
Verwende bitte die Delphi Formatierung für Delphi Code.. Danke.

Der Code kommt nur BIS zu deiner Anwendung.
Wie ich schon sagte du musst die ChildWindows enumerieren bis du das handle des TEdit erfahren hast.

Dann habe ich dich gebeten dir einmal die Funktion von FindWindowEx anzusehen. (Hast gemacht?)
Wenn ja dann würdest du verstehen warum FindWindowEx nicht funktioniert mit einem Handle 0 für das ChildWindow
Was also willst du finden mit einem 0 Handle ? Ohne das du in dem Fremden Fenster die ChildWindows enumerierst.

Zitat:

Retrieves a handle to a window whose class name and window name match the specified strings. The function searches child windows, beginning with the one following the specified child window. This function does not perform a case-sensitive search.
Wenn du das Handle nicht kennst in dem fall wenn du 0 übergibst must du das Window (Der Anwendung) enumerieren bis du das korrekte Handle in Erfahrung gebracht hast.
Wenn du 0 eingibst beginnt die suche nach dem Handle in der ZOrder so wie die Controls auf deinem Window abgelegt sind.


gruss

Der schöne Günther 7. Feb 2017 17:36

AW: FindMemo, FindEdit
 
Zitat:

Zitat von derseitzer (Beitrag 1361038)
Mein TEdit im Programm 2 heißt 'TextFeld'


Zitat:

Zitat von derseitzer (Beitrag 1361043)
Code:
  hbtn:= FindWindowex(Appl2,0,nil,'Textfeld');


Fällt dir was auf? ;-)

EWeiss 7. Feb 2017 17:48

AW: FindMemo, FindEdit
 
Beispiel. (copy\paste)

Delphi-Quellcode:
function EnumChildProc(AHandle: THandle; AItems: TStrings): BOOL; stdcall;
var
  buffer: array[0..255] of Char;
  caption: array[0..255] of Char;
begin
  Result := True;
  GetClassName(AHandle, buffer, SizeOf(buffer)-1);
  SendMessage(AHandle, WM_GETTEXT, 256, Integer(@caption));

  AItems.Add(Format('Handle: %d, Class: %s, Text: %s', [AHandle, buffer, caption]));
end;

//...

procedure TForm1.Button1Click(Sender: TObject);
var
  wHnd: THandle;
  wCls: PChar;
begin
  wCls := PChar('YourTopWindowClassName'); // ex. TForm1
  wHnd := FindWindow(wCls, nil);
  ListBox1.Clear;
  // Get window controls into the listbox
  EnumChildWindows(wHnd, @EnumChildProc, Integer(ListBox1.Items));
end;
gruss

derseitzer 7. Feb 2017 17:51

AW: FindMemo, FindEdit
 
Günter tut mir Leid beide heißen 'Textfeld'.. nicht 'TextFeld'.. mein Fehler:)
EWeiss hmm okay ich versuche es damit.

EWeiss 7. Feb 2017 17:55

AW: FindMemo, FindEdit
 
Zitat:

Zitat von derseitzer (Beitrag 1361047)
Günter tut mir Leid beide heißen 'Textfeld'.. nicht 'TextFeld'.. mein Fehler:)

Spielt keine Rolle solange der Namen stimmt, ob 'Textfeld' oder 'TextFeld' case sensitive sollte dabei nicht berücksichtigt werden.
Günther meint etwas anderes.. vergleiche doch einfach mal die Parameter die du mit FindWindowEx übergibst.

Zitat:

EWeiss hmm okay ich versuche es damit
Na ja es zwingt dich niemand dazu. ;)

gruss

derseitzer 7. Feb 2017 18:03

AW: FindMemo, FindEdit
 
so sollte das nicht rüberkommen :'D Vielen Dank für den Code ich werds auf jedenfall ausprobieren!:)

EWeiss 7. Feb 2017 18:05

AW: FindMemo, FindEdit
 
Zitat:

Zitat von derseitzer (Beitrag 1361049)
so sollte das nicht rüberkommen :'D Vielen Dank für den Code ich werds auf jedenfall ausprobieren!:)

Habe es für dich schon gemacht.
TMemo und TEdit haben nun ein Handle dieses kannst du nun verwenden um Messagen (Text) an das Memo zu senden.

gruss

derseitzer 7. Feb 2017 18:50

AW: FindMemo, FindEdit
 
tut mir leid dass ich so spät schreibe, war abendessen:) oh wow vielen vielen dank!! :thumb: :D

EWeiss 7. Feb 2017 19:00

AW: FindMemo, FindEdit
 
Zitat:

Zitat von derseitzer (Beitrag 1361056)
tut mir leid dass ich so spät schreibe, war abendessen:) oh wow vielen vielen dank!! :thumb: :D

Kein Problem. ;)
Du must jetzt nur anstelle des Windows das ich mit der Classe "TForm" ermittle das der anderen Anwendung verwenden das du ja schon ermittelt hast.

Delphi-Quellcode:
EnumChildWindows(wHnd, @EnumChildProc, Integer(ListBox1.Items));


Das "wHnd" muss das Handle der anderen Anwendung sein.

gruss

derseitzer 8. Feb 2017 08:15

AW: FindMemo, FindEdit
 
Danke nochmal:)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:09 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