Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi In Fremdanwendung Text an die aktuelle Cursorposition senden (https://www.delphipraxis.net/2932-fremdanwendung-text-die-aktuelle-cursorposition-senden.html)

KridRed 14. Feb 2003 12:02


In Fremdanwendung Text an die aktuelle Cursorposition senden
 
Hi,

ich hab folgendes Problem:

ich habe in einem Child Fenster 2 Edit- Felder, die dieselbe Bezeichnung haben. Nun möchte ich in das erste UND in das zweite Feld Einträge machen. Nachdem der Eintrag in das erste Feld gemacht wurde, wechsel ich per wm_Keydown in das nächste Editfeld. Nun möchte ich das so programmieren, dass er den Text an der aktuellen Cursorposition einfügt, dann wäre mein Problem beseitigt.

Hat jemand ne Idee ? Mir raucht die Rübe...


______________

Rock'n'Roll...


Dirk

oki 14. Feb 2003 12:45

Hallo,

was das soll ist mir nicht so richtig klar, aber ich vermute du möchtest eine benutzerdefinierte Abfrage programmieren.

Ich hab das bis jetzt immer so gemacht:

-eine Combobox mit den erlaubten Log-ikwörtern (AND, OR ...);
-eine Combobox mit den Erlaubten Datenbankfeldern (oder Edit-Feld für Werteeingabe;
-ein "Add"-Button zum anfügen der Auswahlen und Einträge in ein Memo.

Was sonst noch notwendig ist bezüglich klammern etc. kann man in der Methode des "Add"-Buttons berücksichtigen (steckt ja immer ne gewisse Logik hinter).

Der Memo-Text kann dann als Abfrage verwendet werden.

Gruß oki

KridRed 14. Feb 2003 12:54

re
 
Zitat:

Zitat von oki
Hallo,

was das soll ist mir nicht so richtig klar, aber ich vermute du möchtest eine benutzerdefinierte Abfrage programmieren.

Ich hab das bis jetzt immer so gemacht:

-eine Combobox mit den erlaubten Log-ikwörtern (AND, OR ...);
-eine Combobox mit den Erlaubten Datenbankfeldern (oder Edit-Feld für Werteeingabe;
-ein "Add"-Button zum anfügen der Auswahlen und Einträge in ein Memo.

Was sonst noch notwendig ist bezüglich klammern etc. kann man in der Methode des "Add"-Buttons berücksichtigen (steckt ja immer ne gewisse Logik hinter).

Der Memo-Text kann dann als Abfrage verwendet werden.

Gruß oki

**********************************

Hi Oki,

das hast du mich falsch Verstanden, ich habe das Handle einer Fremdanwendung... mich durch die Hirachie gahangelt bis ich im ersten Editfeld des Childfensters war - habe dort einen Eintrag über mein Programm gemacht und möchte nun in das nächste Editfeld. Dies mache ich folgendermassen:

postmessage(hMDIChildAcHisEd,wm_KeyDown,integer(PC har(#9)),0);

nun hab ich meinen Cursor in dem Editfeld und möche an die aktuelle Cursorposition einen weiteren Text senden. Dies mache deshalb so, weil das 2te Editfeld den selben Klassennamen hat wie das erste und alle anderen ( insgesamt 5 ) wenn jedes Editfeld nen eingenen Klassennamen hätte, wär das alles ja kein Problem.



Gruß,


Dirk

Luckie 14. Feb 2003 13:01

Hol dir den Text aus dem zweiten Editfeld, häng dein Text dran, schreib alles wieder in das zweite Editfeld rein.

oki 14. Feb 2003 13:03

Ups,

jo, das ist bestimmt machbar, aber bei diesem Thema habe ich zu wenig Erfahrung. Da bin ich leider nicht Dein Partner.

Sorry

oki

KridRed 14. Feb 2003 13:08

Zitat:

Zitat von Luckie
Hol dir den Text aus dem zweiten Editfeld, häng dein Text dran, schreib alles wieder in das zweite Editfeld rein.

Servus Luckie,

das zweite Editfeld ist leer, da soll mein Eintrag rein... ich möchte lediglich an die aktuelle Cursorposition meinen Text senden, da der Cursor schon in dem besagten Editfeld positioniert wurde duch

postmessage(hMDIChildAcHisEd,wm_KeyDown,integer(PC har(#9)),0);

und wie gesagt, wenn ich das Handle vom 2ten Feld hätte ( es haben ALLE Editfelder den selben Klassennamen ) wäre das Problem ja nicht da :o)


Gruß,

Dirk

Luckie 14. Feb 2003 13:16

Das ist dumm. Kennst du die ID des Edits? Die sollte eindeutig sein.

KridRed 14. Feb 2003 13:25

Zitat:

Zitat von Luckie
Das ist dumm. Kennst du die ID des Edits? Die sollte eindeutig sein.

Jau, die hab ich 133074... aber ich weiss nicht wie ich die einsetze, da ich mich erst seit 2 Tagen mit dem Handle und API Thema befasse.


Gruß,

Dirk

janjan 14. Feb 2003 13:31

Das Edit Feld hat doch den Fokus, theoretisch müsste dann alle Tastendrücke die du ans Fenster sendest in diesm Feld landen. Kannste dir das nicht irgendwie zu Nutze machen indem du quasi die Tastatur 'emulierst'?

Luckie 14. Feb 2003 13:34

Wichtig: Ist das Die ID oder das Handle? Das ist ein Unterschied. Hast du die ID kannst du so:
Code:
hEdit := GetDlgItem(hParent, ID_EDIT);
das Handle des Edits bekommen. Dann kannst du mit WM_SETTEXT deine Text in das Edit schreiben. genauso machts du es auch mit dem ersten Edit. Nix mit TAB simulieren oder so.

KridRed 14. Feb 2003 13:59

Zitat:

Zitat von Luckie
Wichtig: Ist das Die ID oder das Handle? Das ist ein Unterschied. Hast du die ID kannst du so:
Code:
hEdit := GetDlgItem(hParent, ID_EDIT);
das Handle des Edits bekommen. Dann kannst du mit WM_SETTEXT deine Text in das Edit schreiben. genauso machts du es auch mit dem ersten Edit. Nix mit TAB simulieren oder so.

// erstes Edit feld suchen
hMDIChildAcHisEd := FindWindowEx(hMDIChildAccHis,0,'_T_Edit',NIL);
// ins 1.Edit Feld den Eintrag machen
SendMessage(hMDIChildAcHisEd,WM_SETTEXT,0,integer( PChar(ComboBox2.Text)));
// Cursor in das 2. Edit Feld positionieren
postmessage(hMDIChildAcHisEd,wm_KeyDown,integer(PC har(#9)),0);

- nun soll dort wo der Cursor steht der Inhalt von ComboBox1 eingefügt werden -

so mache ich das bisher, das zweite Editfeld ist ebenfalls "_T_Edit" - die selben Werte wie das erste und das ist mein Problem.
Deshalb das TAB simulieren um in das nächste _T_Edit zu kommen - insgesamt sind es 5 ! _T_Edit Felder ( brauche aber nur die ersten zwei - wobei ich das Handle vom ersten ja habe und auch schon meinen Eintrag gemacht habe )



Gruß,

Dirk

Luckie 14. Feb 2003 14:08

Zitat:

Zitat von KridRed
// erstes Edit feld suchen
hMDIChildAcHisEd := FindWindowEx(hMDIChildAccHis,0,'_T_Edit',NIL);
// ins 1.Edit Feld den Eintrag machen
SendMessage(hMDIChildAcHisEd,WM_SETTEXT,0,integer( PChar(ComboBox2.Text)));
// Cursor in das 2. Edit Feld positionieren
postmessage(hMDIChildAcHisEd,wm_KeyDown,integer(PC har(#9)),0);

- nun soll dort wo der Cursor steht der Inhalt von ComboBox1 eingefügt werden -

so mache ich das bisher, das zweite Editfeld ist ebenfalls "_T_Edit" - die selben Werte wie das erste und das ist mein Problem.
Deshalb das TAB simulieren um in das nächste _T_Edit zu kommen - insgesamt sind es 5 ! _T_Edit Felder ( brauche aber nur die ersten zwei - wobei ich das Handle vom ersten ja habe und auch schon meinen Eintrag gemacht habe )

Genau und ich habe dir erklärt, wie du es richtig machst. Hol dir das Handle über die ID. Siehe GetDlgItem().
Bei Delphi müßte WinSight dabei liegen. Mit der Anwendung kannst du die ID'S der Kontrolls rausfinden. Alternativ nimm Spy++ vom Visual Studio oder WindowInfo von meiner Seite.

BrainCode 14. Feb 2003 14:22

Unter Visual Basic gibt es einen Befehl namens SendKey oder SendKeys, mit dem man einfach die Tastatur "emulieren" kann, d.h. der übermittelte Text erscheint dort, wo er erscheinen würde, wenn er über die Tastatur eingegeben würde. Gibt es so etwas eventuell auch unter Delphi? VB ist es nämlich egal, welches Fenster aktiv ist. Es sendet einfach den Text, ohne dass man sich darum kümmern muss, wo er hingeht.

KridRed 14. Feb 2003 14:28

Zitat:

Zitat von Luckie
Zitat:

Zitat von KridRed
// erstes Edit feld suchen
hMDIChildAcHisEd := FindWindowEx(hMDIChildAccHis,0,'_T_Edit',NIL);
// ins 1.Edit Feld den Eintrag machen
SendMessage(hMDIChildAcHisEd,WM_SETTEXT,0,integer( PChar(ComboBox2.Text)));
// Cursor in das 2. Edit Feld positionieren
postmessage(hMDIChildAcHisEd,wm_KeyDown,integer(PC har(#9)),0);

- nun soll dort wo der Cursor steht der Inhalt von ComboBox1 eingefügt werden -

so mache ich das bisher, das zweite Editfeld ist ebenfalls "_T_Edit" - die selben Werte wie das erste und das ist mein Problem.
Deshalb das TAB simulieren um in das nächste _T_Edit zu kommen - insgesamt sind es 5 ! _T_Edit Felder ( brauche aber nur die ersten zwei - wobei ich das Handle vom ersten ja habe und auch schon meinen Eintrag gemacht habe )

Genau und ich habe dir erklärt, wie du es richtig machst. Hol dir das Handle über die ID. Siehe GetDlgItem().
Bei Delphi müßte WinSight dabei liegen. Mit der Anwendung kannst du die ID'S der Kontrolls rausfinden. Alternativ nimm Spy++ vom Visual Studio oder WindowInfo von meiner Seite.


Die gesamten ID's sind bei den Editfeldern DIESELBEN ausser das Handle
(0x000F073A) und das erste hat (0x000407F4)

Gruß,

Dirk

Luckie 14. Feb 2003 17:40

Das Handel kannst du vergesen, das ändert sich ja jedes mal. das mit den ID's ist dann natürlich ärgerlich. Wie hast du die denn ermittelt? Und was ist das überhaupt für ein Programm?

KridRed 14. Feb 2003 18:00

Zitat:

Zitat von Luckie
Das Handel kannst du vergesen, das ändert sich ja jedes mal. das mit den ID's ist dann natürlich ärgerlich. Wie hast du die denn ermittelt? Und was ist das überhaupt für ein Programm?

Nochmal Hi Luckie,

also, die bisherigen Klassennamen oder Captions habe ich mit einem Tool gefunden, dass so ähnlich ist wie dein WinInfo.. nur das es die Hirarchie in einem TreeView anzeigt. Dann hab ich mich nurnoch durch die Hirarchie gehangelt ( FindWindow und dann FindWindowEx ) bis ich am gewünschten Ziel war ( in meinem Fall das erst Edit - Feld ) das Programm das ich entwickle, soll Arbeitsprozeduren automatisieren. z.B. du bist BETA Tester und hast eine Datenbank mit deinen Testergebnissen (nur als Beispiel)... in 12 dieser Felder machst DU immer die selben Einträge, dies kostet Zeit und vorallem Nerven... um das zu automatisieren kommt mein Programm ins Spiel, dass auf Knopfdruck die bestimmten Daten in die Felder einfügt, wo du sie ansonsten per Hand eintippen musst. Das Problem an der Sache ist nur, dass die Felder die selbe Fensterklasse haben (bei einer normalen Datenbank wäre das nicht der Fall) und ich dann eben mit TAB die Felder "anspringe" die ich brauche um einen Eintrag zu machen. Wenn ich also nun ein solches Feld "angesprungen" habe und der Cursor dort platziert ist, möchte ich an diese Position einen Text senden... und genau da liegt mein Problem.. wie kann ich Text an die aktuelle Cursorposition senden innerhalb einer Fremdanwendung.

Ich hoffe das war halbwegs verständlich :D



Gruß,


Dirk

janjan 14. Feb 2003 19:07

Da das Edit-Feld den Fokus hat, könnte das mit SendKeys klappen, such einfach mal bei Google nach dieser unit.

KridRed 15. Feb 2003 12:02

Hab die Lösung gefunden falls es jemand mal braucht..
 
Also ich hab mir einfach ne Funktion geschrieben, (nachdem das erste Edit Feld nach Hirarchie durchhangeln gefunden wurde) die in das nächste Editfeld "Jumpt"

Delphi-Quellcode:
function jmpwnd(hand:hwnd;anz:integer):hwnd;
var i:integer;
 begin
  for i:=1 to anz do hand:=getwindow(hand,gw_hwndnext);
   jmpwnd:=hand;
end;
dann folgendermassen ausgeführt:

Delphi-Quellcode:
 hMDIChildAcHisEd := FindWindowEx(hMDIChildAccHis,0,'_T_Edit',NIL);
       if hMDIChildAcHisEd <> 0 then begin
       //Wenn gefunden - Eintrag machen
       SendMessage(hMDIChildAcHisEd,WM_SETTEXT,0,integer(PChar(ComboBox2.Text)));
       //Handle vom ERSTEN Edit Feld finden...
       history:=FindWindowEx(hMDIChildAccHis,0,'_T_Edit',NIL);
       //...spring in das ZWEITE Edit Feld
       history:=jmpwnd(history,2);
        // ins 2.Edit Feld den Eintrag machen
        SendMessage(history,WM_SETTEXT,0,integer(PChar('ComboBox3.Text)));
Falls jemand mal das Problem mit gleichnamigen Klassennamen von Feldern haben sollte und in ein bestimmtes nen Eintrag machen will bzw. das Handle haben will.


Gruß,


Dirk

Tommy1988 29. Jan 2007 17:39

Re: In Fremdanwendung Text an die aktuelle Cursorposition se
 
wie setzte ich denn text AUS einem Edit IN eine fremdanwendung ? sprich: bspw. in einen chat ins <input ...> feld ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 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-2025 by Thomas Breitkreuz