Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Programme steuern

Empfohlene Antworten

Veröffentlicht

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.

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

Hallo..

mh nur aus neugier was für gleiche Arbeiten?

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.

Für sowas gibt es winrunner :cool:

aber ich wäre mit solchen funktionen bei einer TK anlage vorsichtigt da es vorkommen kann das dir mal ein handel wegfliegt usw. und naja dann: "TK Konfiguartion fürn *****"

Das mit dem Winrunner bringt mich nicht weiter. Ist das ein Programm, oder eine Bibliothek?

Wenn Winrunner irgendwie Programme steuern kann, muss es doch auch programmierbar sein, oder?

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)

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?

...

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. ;)

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

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?

naja inerhalb deines fensters goibt es komponenten die ebenfals ein handel habe. nur wie du daran kommst kann ich dir nicht sagen.

Man kann die Kindkomponenten über eine Liste abfragen, die ihrerseits wieder eine Liste mit Kindkomponenten besitzen.

Ist allerdings ziemlich tricky und auch nicht ganz fehlerungefährlich. ;)

Geht das zufällig über FindWindowEx?

Wo können da überall Fehler auftreten?

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.

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

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?

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.