# Auf andere Programme zugreifen



## General Hunter (18. Februar 2005)

Also wie die Überschrift schon sagt, möchte ich gerne auf andere Programme zugreifen. So dass man z.B. in die Textzeile vom internet explorer von VB aus, was reisnchreiben kann.
 (PS: Die Suche hat nix ergeben, nur treads mit dem hinweis, benutzt soch mal die suche *grr*)


----------



## Filone (18. Februar 2005)

Dann musst Du Dir das HWnd der Textbox besorgen (EnumWindows i.V.m. EnumChildWindows) und mit 'SendMessage' und dem Parameter 'LB_INSERSTRING' (wenn ich mich nicht irre) Deinen Text einfügen.

Das ist aber vom Prinzip her kein Programmzugriff, dann würde man eher mit CreateRemoteThread oder WriteProcessMemory arbeiten.


----------



## General Hunter (18. Februar 2005)

Äh SRY. Ich bin da eher neu auf dem Gebiet, vor allem in Richtung fachchinesisch *g*

 Also was heißt das genau, was du da geschriben hast, ich blick da nämlich nicht durch....

 EnumchildWindows is ne api funktion, aber wie genau muss ich die einsetzten, bzw was gibt sie für werte aus und was ist CreateRemoteThread oder WriteProcessMemory?


----------



## Filone (18. Februar 2005)

Wenn Du Text in eine Textbox in einem anderen Programm einfügen willst dann geht das über das HWnd und der API-Funktion 'SendMessage'. SendMessage nimmt zwei Paramter auf, in Deinem Fall ist der erste Parameter 'LB_INSERSTRING' (ich habs jetzt mal nachgeschaut).

Um an das HWnd zu gelangen, musst Du erst das HWnd des IE erfragen und das geht mit 'EnumWindows' aus der API. Diese Funktion ermittelt alle HWnds die momentan vorhanden sind und mit 'GetClassName' musst Du dann herausfinden ob es sich um ein 'IEFrame' handelt.

Anschließend ermittelst Du mit 'EnumChildWindows' alle Unterfenster des IE, darunter befindet sich dann auch die Textbox. Sie hat die Klasse 'ComboBoxEx32'.

Dann kannst Du mit 'SendMessage' und dem wParam 'LB_INSERSTRING' Deinen Text hinsenden.

Hier ist ein Programm, daß Dir alle HWnds ermittelt und damit kannst Du Dir mal anschauen, wie eine typische WindowsForm nur so vor HWnds wimmelt. ##klick## 

Windows arbeitet mit 'Fenstern' - als hätten die das bei Microsoft geahnt.  

//Edit :

Fast vergessen : 

WriteProcessMemory schreibt in den Speicherbereich einer anderen Anwendung, CreateRemoteThread erstellt einen RemoteThread um bspw. eigenen Code in einem anderen Speicherbereich auszuführen.


----------



## General Hunter (19. Februar 2005)

THX, jetzt blick ich schon mehr durch *g*. Aber noch eine Frage: Was geben EnumWindows und EnumChildWindows als wert zurück und wie kann ich sie abrufen?


----------



## Filone (19. Februar 2005)

Man kann es kaum glauben, sie geben das HandleWindow zurück. (war ein Scherz)

EnumWindows und EnumChildWindows arbeiten mit einem CallBack, das bedeutet daß bei jedem gefunden Window eine Funktion aufgerufen wird die Du in Deinem Code angeben musst. Etwa so


```
'in einem Modul
Public Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

Public Function GetWindowHandles(ByVal lngHWnd As Long, ByVal lngParam As Long) As Boolean

 frmMain.lstHWnd.AddItem "HWnd : " & lngHwnd
 GetWindowAttributes = True

End Function

'in einer Form
Private Sub Form_Load()

 EnumWindows AddressOf GetWindowHandles, ByVal 0&

End Sub
```

Wenn Deine Form geladen wird, führt der Code die API 'EnumWindows' aus. Bei jedem gefundenen Window verweist sie auf die Funktion 'GetWindowHandles' und übergibt die Parameter lngHwnd (das HWnd des Fensters) und lParam - das ist der CallBack der Funktion den man in VB mit dem 'AddressOf [FunktionsName]' angibt. Das HWnd wird in einer Listbox gespeichert.

Dort kannst Du dann auch mit 'EnumChildWindows' alle Unterfenster suchen lassen.

Probiers mal aus, setz den Code in eine frmMain, füge eine ListBox 'lstHWnd' ein und lade die Form.


----------



## General Hunter (10. März 2005)

So! hatte in letzter zeit viel zu tun und hab das jetzt mal ausprobiert, aber ich bekomme lauter fehlermeldungen...

 Und.. was ist ein modul?


----------



## Filone (10. März 2005)

Projekt - Modul einfügen.

Ansonsten ist es zwar traurig, daß Du Fehlermeldungen bekommst aber ich kann nicht erahnen, welche es sind. Und meine Glaskugel ist gerade auf der Bowlingbahn, poste doch mal die Fehler. Dann sehen wir weiter.


----------



## General Hunter (10. März 2005)

also jetzt kommt die fehlermeldung
   Objekt erforderlich
   in der zeile (debugger):

   frmMain.lstHWnd.AddItem "HWnd : " & lngHWnd

  EDIT: SRY! mein fehler aber in der liste steht jetzt nur ein wert! wie geht das jetzt mit enum child windows?


----------



## Filone (11. März 2005)

Es geht genauso wie in meinem Code oben beschrieben. Deklarationsanweisung 'EnumWindows' einfügen, Funktion schrieben auf die der Callback verweist und Vollgas.

Eines stimmt oben nicht, die Zeile muss lauten


```
GetWindowHandles = True
```

und nicht


```
GetWindowAttributes = True
```


Beachte daß hiermit nur die HWnd gelesen werden, wenn Du den Fensternamen haben willst mußt Du noch mit 'GetWindowName' arbeiten.


----------

