Autor Beitrag
error
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Di 19.11.02 21:45 
Hi,
ich möchte in ein Edit-Feld eines fremden Programms einen bestimmten String hereinschreiben. Wie mach ich das?

mfg
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Di 19.11.02 21:51 
Wie bekommst du das Handle des Editfelds?
error Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Di 19.11.02 21:53 
Hmm das ist eines meiner Probleme :)
Was ich hab ist der Fenster-Titel... und das Wissen dass es nur dieses eine Edit-Feld in dem Fenster gibt.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 19.11.02 22:26 
Also zu diesem Thema habe ich schon genug Code hier gepostet.
error Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Di 19.11.02 23:03 
Luckie hat folgendes geschrieben:
Also zu diesem Thema habe ich schon genug Code hier gepostet.


Ja, hast du, aber:
- Es ging da um Buttons nicht um Edits
- Ich hab weder Zeit noch Geduld mir zig-Seite Abhandlungen über irgendwas durchzulesen, nur um dann eine Zeile Source schreiben zu können. Ihr seid/Du bist warscheinlich jemand der Ahnung von dem Thema hat und mir kurz ein paar Zeilen Source geben können. Ich bin leider Schüler und habe nicht ewig Zeit...
- Wenn ich dich jetzt nicht völlig verschreckt habe habe ich auch noch eine Frage:
ausblenden Quelltext
1:
2:
3:
4:
  hMenu := GetMenu(hWnd);
  hSubmenu := GetSubmenu(hMenu, 0);
  MenuItemID := GetMenuItemID(hSubMenu, 1);
  SendMessage(hWndVD, WM_COMMAND, MenuItemID, 0);

^-- Krieg ich dazu noch eine Erklärung? (Was macht was usw)
Was ich mir bereits gedacht/erarbeitet habe ist:
GetSubmenu(hMenu, 0); = Ersten Menüpunkt auswählen
GetMenuItemID(hSubMenu, 1); = 2. Unterpunkt auswählen
SendMessage(hWndVD, WM_COMMAND, MenuItemID, 0); = 2. Unterpunkt "klicken"

Stimmt das so?

mfg error
Verfechter des Lerning-By-Doing
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 19.11.02 23:33 
Jupp, stimmt genau.
error Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Di 19.11.02 23:34 
Luckie hat folgendes geschrieben:
Jupp, stimmt genau.


Hast du zufällig noch Lust mir zu sagen wie das mit den Edits geht?
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Di 19.11.02 23:46 
error hat folgendes geschrieben:
ausblenden Quelltext
1:
2:
3:
4:
  hMenu := GetMenu(hWnd);
  hSubmenu := GetSubmenu(hMenu, 0);
  MenuItemID := GetMenuItemID(hSubMenu, 1);
  SendMessage(hWndVD, WM_COMMAND, MenuItemID, 0);


...

Was ich mir bereits gedacht/erarbeitet habe ist:
GetSubmenu(hMenu, 0); = Ersten Menüpunkt auswählen
GetMenuItemID(hSubMenu, 1); = 2. Unterpunkt auswählen
SendMessage(hWndVD, WM_COMMAND, MenuItemID, 0); = 2. Unterpunkt "klicken"


Ich lese da nur Menu und Menu und Menu. Wenn du irgendetwas in ein Editfeld schreiben willst, wie kommst du drauf dir ein Beispiel auszusuchen in dem nur das Wort Menu vorkommt?

Hier ein Beispiel wie mans machen kann. Zuerst das Handle des Programms suchen, dann des Childfensters (z.B. Edit) und los gehts:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button1Click(Sender: TObject);
var
  Wnd : HWND;
begin
  //Notepad entwerder über die Klasse oder den Fenstertitel suchen
  //Beispiel für suchen über Klasse
  Wnd := FindWindow('Notepad', nil);
  if Wnd <> 0 then begin
    //Childwindow über Klasse suchen
    //Das Eingabefeld hat die Klasse "Edit"
    Wnd := FindWindowEx(Wnd, 0, 'Edit', nil);
    //Text ins Notepad schreiben.
    SendMessage(Wnd, WM_SETTEXT, 0, LongInt(PChar('Irgend ein Text')));
  end;
end;
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 19.11.02 23:49 
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  hWnd, hEdit: Cardinal;
  buffer: array[0..255] of Char;
begin
  hWnd := FindWindow(nil, 'Fenstertitel');
  hEdit := GetDlgItem(hWnd, ID_des_Edits);
  lstrcpy(buffer, 'Hello world');
  SendMessage(hEdit, WM_SETTEXT, 0, Integer(@buffer));

Da das Edit eventuell leer ist kann man es schlecht über seinen Text finden und da auch eventuell mehrere Edits in dem Fenster gibt, ist ein Finden des Handles über die Fensterklasse auch schlecht. Das sicherste ist über die ID des Edits zu gehen. Die kannst du mit WinSight raus finden, das bei Delphi beiliegt. Starte das Programm, öffne WinSight und such dir das Edit raus. Die Angabe kann im dezimal Format oder im hexadezimal Format erfolgen.
Eine weiter Bedingung ist, dass das Parent vom Edit auch das Hauptfenster ist. Ist das nicht der Fall, wird es etwas aufwendiger, denn dann muß man sich das Edit mit EnumChildWindows suchen.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 19.11.02 23:54 
@Popov: Was passiert bei deinem Code, wenn es mehrer Edits auf dem Fenster gibt? Für Notepad ist es OK keine Frage, das hat nur eins, ist aber auch der einfachste Fall. :wink:
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mi 20.11.02 01:45 
@Luckie

Wenn es mehrere Editfelder gibt, dann hab ich Pech gehabt und frage Luckie ;) Der kennt sich zu Not besser dammit aus. Aber ...

error hat folgendes geschrieben:
Hmm das ist eines meiner Probleme :)
Was ich hab ist der Fenster-Titel... und das Wissen dass es nur dieses eine Edit-Feld in dem Fenster gibt.


In den letzten Tagen haben wir doch festgestellt, daß es viele Möglichkeiten gibt das Handle eines Fensters zu finden. Zu hause benutze ich z.B. ein Programm mit dem ich Passwörter ins DFÜ eingebe. Man sollte wissen, daß ich die DFÜ Passwörter nicht von Windows anspeichern lasse, da sie zu leicht auszulesen sind. Starte ich z.B. eine Verbindung, dann klicke ich auch kurz auf ein TrayIcon und ein kleines Fenster plaziert sich neben der DFÜ Einwahl. In diesem Fenster sind viele meiner Passwörter kodiert angespeichert. Brauche ich eins, dann ziehe ich die Maus kurz von meinem Fenster auf das Passwort Feld und schon wird ein Passwort an das Editfeld gesendet. Das Programm nutze ich sein fast einem Jahr.

Es ist eine von vielen Möglichkeiten und auch eine nach der auch immer gefragt wird. Allerdings fragt einer nie so wie er fragen sollte. Es kommt immer die Frage wie man an ein Editfeld etwas senden kann und ich gebe immer das Beispiel wie man es macht, aber ohne meine Lösung (weil ich nicht weiss ob er meine Lösung braucht). Da aber nie jemand nachhack sondern sich lieber auf irgendwelche Diskusionen mit anderen einläßt, wird das Beispiel nie meine Festplatte verlassen. Was soll ich machen? Soll ich den Leuten nachlaufen und rufen: ich ich ich, ich hab die Lösung. Ich kann nicht wissen was der genau will und gebe bei dieser Frage immer den normalen Code an. Ich kann ja nicht wissen was und wie er das lösen will. Wenn aber einer das nicht umsetzen kann und lieber an anderer Stelle diskutiert, dann hab ich mit meiner Lösung Pech gehabt.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 20.11.02 04:05 
Jupp sehe ich genauso. Und das ist auch meine strandard Lösung. Das mit dem einem Edit habe ich überlesen.. Wenn man es optimal machen will, dann muß das Problem genau umrissen werden und die Aufgabenstellung muß klar sein.

Na, jedenfalls hat er jetzt zwei Quellcodes, die es tun sollten.
error Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Mi 20.11.02 10:28 
Danke ihr beiden... jetzt hab ich nur noch eine Frage an Luckie:
Ist die ID des Edits Systemunabhängig und bleibt sie auch nach einem Neustart gleich?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 20.11.02 13:37 
Eine ID ist kein Handle, welches sich bei jedem Programmstart ändert. Eine ID wird vom Programmierer vergeben.
error Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64



BeitragVerfasst: Mi 20.11.02 13:44 
Luckie hat folgendes geschrieben:
Eine ID ist kein Handle, welches sich bei jedem Programmstart ändert. Eine ID wird vom Programmierer vergeben.


Das wollte ich wissen Danke... dann noch ne Frage:
Ich benutze zum rausfinden der IDs nicht dieses Delphi-Prog sondern ein andere Programm, da ich auf dem PC kein Delphi installiert hab. Jetzt muss ich wissen: Was kommt als ID am ehesten hin: 520 ("Fensterhandle") oder 37c6 ("Instanzenhandle")?

thx ia error

Btw: Kann ich dich auch über icq was fragen oder nerv ich dann zusehr? :D
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 20.11.02 13:56 
Keins von beiden. "Fensterhandle" ist, wie man fast vermuten könnte das Handle und "Instanzenhandle" ist die programm Instanz. Versuch es mal mit meinem Programm "WindowInfo" von meiner Seite. 8Der Wert ist hexadezimal.