Zum Inhalt springen

Programme steuern


strico

Empfohlene Beiträge

Hallo, ich möchte ein fremdes Programm steuern, um verschiedene (gleiche) Arbeiten zu automatisieren. Das Programm bietet keine COM-Schnittstellen an.

Wäre dankbar für verschiedene Ansätze. Vielleicht über den Handle oder so?

Angenommen ich öffne ein Programm mit 3 Textboxen. Nun soll der Fokus in die 2te Box gesetzt werden und genau dort ein Text hineingeschrieben werden. Hat jede Textbox ein Handle??? Kann man die Box darüber ansprechen, wenn ja, wie?

Die Möglichkeit mit sendkeys zu arbeiten ist nicht so berauschend. Wenn das Programm den Fokus verliert werden die Tastendrücke falsch weitergeleitet. Und in irgendeine Box den Fokus über Tab zu setzen ist auch nicht so berauschend und sicher.

Vielen Dak für eure Antworten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sry, das ich vergessen habe zu sagen. dass ich das Problem mit VB.NET lösen möchte. Ich schau mir den Link dann mal an. Danke schon mal.

Nachtrag:

Wenn es mit der API möglich ist, müsste mir nur noch erklärt werden wie ich über die Handles in .NET hin und herspringe.

Ich versuche derzeit mit Diagnostics.Process die Eingaben auf den Process irgendwie umzuleiten. Ich weiß allerdings nicht, ob das möglich ist, was ich brauche.

Zu den gleichen Arbeiten: Wir haben mehrere TK-Anlagen. Dazu gibt es ein Tool, welches leider keine Möglichkeit bietet eine Änderung auf allen Anlagen zu tätigen. Man muss so eine Einstellung bei jeder Anlage machen. Dies soll automatisch gehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Winrunner ist eine Testing software mit der es möglich ist eine ander software zu steuern.

Leider habe ich selbst die erfahrung gemacht das es nicht ganz ohne ist so etwas selbst zu Entwickeln. DEas Problem ist das du beim straten eines Programms nicxht immer das selbe handel hast und naj der Name eines Fensters ist auch nicht immer der gleiche. Siehe Word oder den IE (als negativbeispiel)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Angenommen das Fenster hat immer den gleichen Namen, hättest du dann eine herangehensweise für mich?

-------------------------------------------------------------

Ich habe mir den Link :

http://forum.fachinformatiker.de/del...en-delphi.html

angeschaut und versucht die Methode FindWindow zu verwenden (über Declare eingebunden). Leider hat sich VS2005 gemeldet: Das Gleichgewicht des Stapels wurde gestört ... irgendwas mit PInvoke Zielsignatur etc.

Kann man die API-Funktionen nicht verwenden oder was mach ich falsch?

Link zu diesem Kommentar
Auf anderen Seiten teilen

...

angeschaut und versucht die Methode FindWindow zu verwenden (über Declare eingebunden). Leider hat sich VS2005 gemeldet: Das Gleichgewicht des Stapels wurde gestört ... irgendwas mit PInvoke Zielsignatur etc.

Kann man die API-Funktionen nicht verwenden oder was mach ich falsch?

Das sollte eigentlich schon funktionieren. Zumindest hab ich ein Beispiel im Netz gefunden:

http://support.microsoft.com/default.aspx?scid=kb%3Bde%3B302295

Wenn du deinen Quelltext postest, kann dir viel eher geholfen werden. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Auf der Microsoft Seite habe ich eine FindWindow Version mit einem Long-Wert als ersten Parameter gefunden. Mit String als ersten Parameter gehts soweit.

    Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long


    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

        MsgBox(FindWindow("", ""))

    End Sub
Wie benutze ich jetzt diese Methode? Ich hab mal bissl rumprobiert und festgestellt, dass egal, was ich für Parameter übergebe immer eine Zahl bekomme, die jedes mal, wenn ich klicke größer wird. Was ist der Unterschied zwischen
    Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 
und
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As String) As Long

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab mir mal noch paar gedanken gemacht. Ich hab ja nen 32 Bit System und Long ist 8 Byte groß.

Wenn ich jetzt den FindWindow-Rückgabewert nach Links verschiebe, kommt 0 raus, wenn der Rechner zu ist und eine stets konstante Zahl, wenn er auf ist. Also schonmal nen Erfolg.

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

        MsgBox(FindWindow(Nothing, "Rechner") << 32)

    End Sub


    Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Ich hoffe nur, dass ein Handle auch 32 Bit hat, nicht das da noch etwas anderes mit drin hängt.

Ich glaube, ich muss die 32 Bit auch wieder nach Rechts verschieben, wäre ja sonst ne falsche Zahl.

2. Wie weiter, wenn ich jetzt das Fensterhandle habe?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wieder was neues. Anfangs habe ich erwähnt, dass der Stapel aus dem Gleichgewicht gerät. Das liegt daran, dass der Datentyp Long 8 Byte in .Net hat. Man muss Int32 nehmen, dann klappt das.

Beispiel:

so nicht

Declare Function BringWindowToTop Lib "user32.dll" (ByVal hWnd As Long) As Long
so muss es gemacht werden
Declare Function BringWindowToTop Lib "user32.dll" (ByVal hWnd As Int32) As Int32

Wenn ich weiter gekommen bin melde ich mich wieder. Vielleicht hat ja auch noch jemand anderes Anregungen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

hab selbiges mal in vb6 gemacht

(hat auf jedenfall funktioniert ;-))

damit kann man ein fenster in den vordergrund holen

Private Declare Function FindWindow Lib "user32" Alias _

    "FindWindowA" (ByVal lpClassName As String, _

    ByVal lpWindowName As String) As Long


Private Declare Function SetWindowPos Lib "user32" _

    (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _

    ByVal X As Long, ByVal y As Long, ByVal cx As Long, _

    ByVal cy As Long, ByVal wFlags As Long) As Long


Public Sub vVordergrund(Optional ByVal sDialogName As String, _

                        Optional ByVal lHandle As Long)


    Dim wHandle As Long


    If sDialogName <> "" Then

        wHandle = FindWindow(vbNullString, sDialogName)

    ElseIf lHandle <> 0 Then

        wHandle = lHandle

    End If

    Call SetWindowPos(wHandle, -1, 0, 0, 0, 0, 3)

End Sub

Link zu diesem Kommentar
Auf anderen Seiten teilen

So bekomme ich alle Handles des Rechners. Die sind dann in der Arraylist gespeichert.

Dim al As New ArrayList

    '#-----------------------------------

    Public Delegate Function EnumChilds(ByVal ChWnd As Int32, ByVal lParam As Int32) As Int32


    Public Declare Function EnumChildWindows Lib "user32" ( _

                    ByVal hWndParent As Int32, _

                    ByVal lpEnumFunc As EnumChilds, _

                    ByVal lParam As Int32) As Int32

    '#-----------------------------------

    Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Int32


    Public Sub SearchAllChildsFrom(ByVal hwnd As Int32)

        EnumChildWindows(hwnd, AddressOf _EnumChildCallBackFunc_, 0)

    End Sub

    '

    Public Function _EnumChildCallBackFunc_(ByVal ChWnd As Int32, ByVal lParam As Int32) As Int32

        al.Add(ChWnd)

        Return 1 '# Damit alle gesucht werden Return 0 würde nur 1 suchen, bzw. suche abbrechen

    End Function



    '#

    '#

    '#

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

        Dim i As Int32

        i = FindWindow(Nothing, "Rechner")

        Me.SearchAllChildsFrom(i)

End Sub

Wie kann ich jetzt Eigenschaften der Steuerelemente, die hinter den Handles liegen, ansprechen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...