| Autor | 
Beitrag | 
error 
        
 
Beiträge: 64 
 
 
 
 | 
Verfasst: Di 19.11.02 20: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 
 
 
 
 | 
Verfasst: Di 19.11.02 20:51 
 
Wie bekommst du das Handle des Editfelds? 
 
 | 
 | 
error   
        
 
Beiträge: 64 
 
 
 
 | 
Verfasst: Di 19.11.02 20: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 
 
 
 
 | 
Verfasst: Di 19.11.02 21:26 
 
Also zu diesem Thema habe ich schon genug Code hier gepostet. 
 
 | 
 | 
error   
        
 
Beiträge: 64 
 
 
 
 | 
Verfasst: Di 19.11.02 22: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: 
 		                                                          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 
 
 
 
 | 
Verfasst: Di 19.11.02 22:33 
 
 | 
 | 
error   
        
 
Beiträge: 64 
 
 
 
 | 
Verfasst: Di 19.11.02 22: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 
 
 
 
 | 
Verfasst: Di 19.11.02 22:46 
 
	  | error hat folgendes geschrieben: | 	 		  		                                                          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:
 		                                                          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 
 
 
 
 | 
Verfasst: Di 19.11.02 22:49 
 
		                                                          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 
 
 
 
 | 
Verfasst: Di 19.11.02 22: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.    
 
 | 
 | 
Popov 
Gast
 
Erhaltene Danke: 1 
 
 
 
 | 
Verfasst: Mi 20.11.02 00: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 
 
 
 
 | 
Verfasst: Mi 20.11.02 03: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   
        
 
Beiträge: 64 
 
 
 
 | 
Verfasst: Mi 20.11.02 09: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 
 
 
 
 | 
Verfasst: Mi 20.11.02 12:37 
 
Eine ID ist kein Handle, welches sich bei jedem Programmstart ändert. Eine ID wird vom Programmierer vergeben. 
 
 | 
 | 
error   
        
 
Beiträge: 64 
 
 
 
 | 
Verfasst: Mi 20.11.02 12: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?    
 
 | 
 | 
Luckie 
Ehemaliges Mitglied
 
Erhaltene Danke: 1 
 
 
 
 | 
Verfasst: Mi 20.11.02 12: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. 
 
 | 
 |