PHP und AutoIT [gelöst] -> wie funktioniert ControlSend?

  • Halli Hallo

    ich als Neuling in dieser Community habe folgendes Problem.

    Ich soll für einen kleinen Laden, wo ich derzeit ein Praktikum absolviere, ein Kundeninterface schreiben. Das Interface soll dafür dienen, dass Neukunden sich an einem Laptop mittels ein Formular, welches ich in PHP geschrieben habe, registrieren können. Die eingebene Daten sollen dabei in Outlook 2007 eingefügt werden.

    Der jenige, der vor mir sein Praktikum dort absolvierte, hat ein AutoIT Script geschrieben, dass eine .csv Datei auswählt und den Datensatz in den BCM von Outlook 2007 einfügt.

    Meine Frage jetzt: Sobald der Kunde seine Daten eingegeben hat im PHP Formular sollen diese Daten in eine .csv Datei geschrieben werde. Ist dies erledigt, soll direkt im Hintergrund AutoIT diese Datei nehmen und in Outlook einfügen. Gibt es in PHP (oder JavaScript) ein Befehl, der es möglich macht, nach dem Senden der Dateien AutoIT zu öffnen, der den nächsten Schritt erledigt?

    Ich hoffe, das meine Ausdrucksweise jetzt nicht komplett unverständlich ist.

    MfG,
    Flo

    2 Mal editiert, zuletzt von Fl0W (20. Oktober 2009 um 16:34)

  • Also erstmal willkommen in Forum

    Wenn ich das richtig verstehe willst du das wenn die PHP fertig ist mit AutoIt die Datei einfügen
    Nun noch eine Frage
    Existier die Datei schon befor die PHP fertig ist und AutoIt gestartet werden soll?
    Weil wenn nicht währe es eig zimlich einfach, du könntest mit AutoIt einfach überprüfen ob die Datei Existiertm und wenn ja kopiert AutoIt sie in Outlook

    und sont kannst du z.B. überpfrüfen ob die Datei am irgendein zeichen enthält, das es nur enthält wenn sie fertig ist

    mfg. Jam00

  • Die Datei existiert bereits. Es wird jedes Mal, wenn ein neuer Kunde sich registriert der zuvorige Kunde in der Datei überschrieben.

  • Und wir die Datei auf einen Schlag geändert oder nach und nach, weil sonst könntest du sie einfach einlesaen und mit der alten datei vergleichen.
    Oder du schreibst die PHP um so das sie wenn alles fertig irgendeine datei erstellt z.B. einfach 1.txt und sobal diese existier mach autoit seinen teil

    mfg. Jam00

  • Die Datei wird auf einen Schlag geändert. Heißt, wenn ein neuer sich reinschreibt, ändern sich alle Daten.

  • Wie groß ist denn die Datei so im Durschnitt, wenn sie nciht alzugroß ich kannst einfach dashier probieren

    Spoiler anzeigen
    [autoit]

    $FileOld = FileRead ("Hier der Pfad zu der Datei in die das PHP-Script schreibt") ;Das liest er einmal aus und das ist der Stand wie sie gerade ist, also das Programm muss gestartet werden bevor man die PHP benutzt
    While 1
    If $FileOld <> FileRead("Hier der Pfad zu der Datei in die das PHP-Script schreibt") Then ExitLoop
    Sleep (100)
    WEnd
    MsgBox (0,"","Es wurde ein Neuer eintrag gemacht") ; Hier kannst du dann dein Script reinbauen

    [/autoit]

    mfg. Jam00

  • gut, das Script funktioniert. Wobei was ich etwas komisch finde, ist die Tatsache, das auch wenn neue Daten eingetragen werde, erst der Hinweis erscheint, wenn ich die csv Datei mit Excel öffne.

    Hier der Quellcode:

    [autoit]

    $FileOld = FileRead ("E:\xampplite\htdocs\it-haus24\kunden2.csv") ;Das liest er einmal aus und das ist der Stand wie sie gerade ist, also das Programm muss gestartet werden bevor man die PHP benutzt
    While 1
    If $FileOld <> FileRead("E:\xampplite\htdocs\it-haus24\kunden2.csv") Then ExitLoop
    Sleep (100)
    WEnd
    MsgBox (0,"","Es wurde ein Neuer eintrag gemacht") ; Hier kannst du dann dein Script reinbauen
    ;Outlook starten
    If WinExists("Posteingang") Then
    WinActivate ("Posteingang")
    Else
    Run ("C:\Programme\Microsoft Office\Office12\OUTLOOK.Exe")

    EndIf
    ;Warten bis Outlook bereit ist
    WinWaitActive("Posteingang ")
    ;Wähle den Menüeintrag Datei aus
    Send("{Alt}{Enter}")
    ;Warte kurz
    sleep (200)
    ;Wähle Import aus
    Send ("{x}")
    ;Wähle BCM aus
    Send("{Down}")
    Send ("{ENTER}")
    ;Wähle IMPORTIEREN aus
    Winwaitactive("Geschäftsdatenimport")
    Send ("{ENTER}")
    ;Wähle Kommagetrennte Werte aus
    Send ("{TAB}{TAB}{TAB}{DOWN}{DOWN}{DOWN}")
    Sleep (500)
    ;Wähle Durchsuchen aus
    Send ("{TAB}{TAB}{Enter}")
    Sleep (500)
    Send ("{Tab}{Tab}{Tab}{Tab}")
    Send ("{Enter}")
    ;Klicke Durchsuchen an
    WinWaitActive("Öffnen")
    ;Sende Dateinamen
    send ("kunden.csv{Enter}")
    ;Wähle Dublikate nicht importieren
    Send ("{Tab}{Tab}{Tab}{Tab}{Tab}{Tab}{Down}")
    Send ("{Tab}{Tab}{Tab}{Tab}{Enter}")
    Send ("{Enter}{Enter}")
    ;Warte Importiervorgang 10 Sek Ab
    Sleep (10000)
    ;Schließe den Importassistenten
    Send ("{Enter}")

    [/autoit]
  • Probier es mal so vieleicht gehts dann

    Spoiler anzeigen
    [autoit]

    $FileOld = FileRead ("E:\xampplite\htdocs\it-haus24\kunden2.csv") ;Das liest er einmal aus und das ist der Stand wie sie gerade ist, also das Programm muss gestartet werden bevor man die PHP benutzt
    While 1
    $File = FileOpen ("E:\xampplite\htdocs\it-haus24\kunden2.csv",0)
    If $FileOld <> FileRead($File) Then ExitLoop
    FileClose ($File)
    Sleep (100)
    WEnd
    MsgBox (0,"","Es wurde ein Neuer eintrag gemacht") ; Hier kannst du dann dein Script reinbauen
    ;Outlook starten
    If WinExists("Posteingang") Then
    WinActivate ("Posteingang")
    Else
    Run ("C:\Programme\Microsoft Office\Office12\OUTLOOK.Exe")

    [/autoit] [autoit][/autoit] [autoit]

    EndIf
    ;Warten bis Outlook bereit ist
    WinWaitActive("Posteingang ")
    ;Wähle den Menüeintrag Datei aus
    Send("{Alt}{Enter}")
    ;Warte kurz
    sleep (200)
    ;Wähle Import aus
    Send ("{x}")
    ;Wähle BCM aus
    Send("{Down}")
    Send ("{ENTER}")
    ;Wähle IMPORTIEREN aus
    Winwaitactive("Geschäftsdatenimport")
    Send ("{ENTER}")
    ;Wähle Kommagetrennte Werte aus
    Send ("{TAB}{TAB}{TAB}{DOWN}{DOWN}{DOWN}")
    Sleep (500)
    ;Wähle Durchsuchen aus
    Send ("{TAB}{TAB}{Enter}")
    Sleep (500)
    Send ("{Tab}{Tab}{Tab}{Tab}")
    Send ("{Enter}")
    ;Klicke Durchsuchen an
    WinWaitActive("Öffnen")
    ;Sende Dateinamen
    send ("kunden.csv{Enter}")
    ;Wähle Dublikate nicht importieren
    Send ("{Tab}{Tab}{Tab}{Tab}{Tab}{Tab}{Down}")
    Send ("{Tab}{Tab}{Tab}{Tab}{Enter}")
    Send ("{Enter}{Enter}")
    ;Warte Importiervorgang 10 Sek Ab
    Sleep (10000)
    ;Schließe den Importassistenten
    Send ("{Enter}")

    [/autoit]

    mfg. Jam00

  • okay, das funktioniert jetzt. Kann man dem Script beibringen, dass es ständig im Hintergrund laufen soll? Sprich, wenn ein Datensatz eingetragen wurde und das Script diesen eingetragen hat, weiterläuft. Weil sonst müsste man jedesmal nachdem sich ein Kunde eingetragen hat, das Script wieder öffnen.

    Ach ja, gibt es auch eine Möglichkeit, dass das Script im Hintergrund läuft? Weil im Moment sieht man den Vorgang auf dem Schirm. Gerade das sollte vermeidbar sein.

  • okay, das funktioniert jetzt. Kann man dem Script beibringen, dass es ständig im Hintergrund laufen soll? Sprich, wenn ein Datensatz eingetragen wurde und das Script diesen eingetragen hat, weiterläuft. Weil sonst müsste man jedesmal nachdem sich ein Kunde eingetragen hat, das Script wieder öffnen.


    Einfach ans ende sowas wie

    [autoit]


    Exit
    ShellExecute(@ScriptName]

    [/autoit]


    Ach ja, gibt es auch eine Möglichkeit, dass das Script im Hintergrund läuft? Weil im Moment sieht man den Vorgang auf dem Schirm. Gerade das sollte vermeidbar sein.


    Natürlich gibt es die. aber da du in deinem script explizit das Fenster in den Vordergrund holst, ist es klar dass es sichtbar wird. Du müsstest die Daten statt mit Send, mit ControlSend() abschicken. Dann kannst du auch die ganzen TABs weglassen. Schau dir am besten mal controlsend() in der Hilfe an

  • SEuBo
    Dann aber ShellExecute zuerst da wenn exit ausgeführt ist das programm nichts mehr macht und somti shellexecute nicht mehr ausgeführt wird

  • So läuft das script weiter

    Spoiler anzeigen
    [autoit]

    While 1
    $FileOld = FileRead ("E:\xampplite\htdocs\it-haus24\kunden2.csv") ;Das liest er einmal aus und das ist der Stand wie sie gerade ist, also das Programm muss gestartet werden bevor man die PHP benutzt
    While 1
    $File = FileOpen ("E:\xampplite\htdocs\it-haus24\kunden2.csv",0)
    If $FileOld <> FileRead($File) Then ExitLoop
    FileClose ($File)
    Sleep (100)
    WEnd
    ;Outlook starten
    If WinExists("Posteingang") Then
    WinActivate ("Posteingang")
    Else
    Run ("C:\Programme\Microsoft Office\Office12\OUTLOOK.Exe")

    [/autoit] [autoit][/autoit] [autoit]

    EndIf
    ;Warten bis Outlook bereit ist
    WinWaitActive("Posteingang ")
    ;Wähle den Menüeintrag Datei aus
    Send("{Alt}{Enter}")
    ;Warte kurz
    sleep (200)
    ;Wähle Import aus
    Send ("{x}")
    ;Wähle BCM aus
    Send("{Down}")
    Send ("{ENTER}")
    ;Wähle IMPORTIEREN aus
    Winwaitactive("Geschäftsdatenimport")
    Send ("{ENTER}")
    ;Wähle Kommagetrennte Werte aus
    Send ("{TAB}{TAB}{TAB}{DOWN}{DOWN}{DOWN}")
    Sleep (500)
    ;Wähle Durchsuchen aus
    Send ("{TAB}{TAB}{Enter}")
    Sleep (500)
    Send ("{Tab}{Tab}{Tab}{Tab}")
    Send ("{Enter}")
    ;Klicke Durchsuchen an
    WinWaitActive("Öffnen")
    ;Sende Dateinamen
    send ("kunden.csv{Enter}")
    ;Wähle Dublikate nicht importieren
    Send ("{Tab}{Tab}{Tab}{Tab}{Tab}{Tab}{Down}")
    Send ("{Tab}{Tab}{Tab}{Tab}{Enter}")
    Send ("{Enter}{Enter}")
    ;Warte Importiervorgang 10 Sek Ab
    Sleep (10000)
    ;Schließe den Importassistenten
    Send ("{Enter}")
    Wend

    [/autoit]

    mfg. Jam00

  • Okay, ich wollte SEuBOs Tipp umsetzen, aber irgendwie komme ich schon am Anfang nicht weiter. Deshalb meine Frage: Wie setze ich in dem Script das ControlSend ein? Weil wie gesagt, ich will nicht, dass der Benutzer sieht, dass Outlook sich öffnet und diesen Vorgang erledigt.

  • Okay, ich wollte SEuBOs Tipp umsetzen, aber irgendwie komme ich schon am Anfang nicht weiter. Deshalb meine Frage: Wie setze ich in dem Script das ControlSend ein? Weil wie gesagt, ich will nicht, dass der Benutzer sieht, dass Outlook sich öffnet und diesen Vorgang erledigt.

    [autoit]


    ShellExecute("wordpad.exe")
    Do
    sleep(1)
    Until WinExists("Dokument - ")
    $handle = WinGetHandle("Dokument - ")
    WinSetState($handle,"",@SW_MINIMIZE)
    If WinMenuSelectItem($handle,"","&Datei","Seite ein&richten") = 0 Then
    MsgBox(0,"","Nicht gefunden")
    Else
    ControlSend("Seite einrichten","","ComboBox1","A5")
    ControlSetText("Seite einrichten","","Edit1","15");Links
    ControlSetText("Seite einrichten","","Edit2","10");Rechts
    ControlSetText("Seite einrichten","","Edit3","10");Oben
    ControlSetText("Seite einrichten","","Edit4","5");Unten
    ControlClick("Seite einrichten","","Button4");querformat
    ;~ ControlClick("Seite einrichten","","Button6");okey button
    EndIf

    [/autoit]

    Schau dir das mal an - vielleicht hilf es dir weiter.
    ControlSend sendet Zeichen,
    ControlSettext ändert den text eines controls (text in edit-feldern zb)
    ControlClick klickt ein Control an.

    Die Controlnamen, die du benutzen musst, findest du mit dem AutoIt Window Info Tool (Au3Info.exe im autoit verzeichnis) einfach mal starten und das Finder-Tool benutzen ;)

    Ich empfehle auch die Hilfe zu WinMenuSelectItem anzugucken - Da gibt es eine besonderheit für unterstichene buchstaben im Menü.

  • Ok.
    Hier mal eine kleine Erklärung.

    Der Aufbau der Funktion: ControlSend ( "title", "text", controlID, "string")

    Die Erklärung:
    Title=Titel des Fensters, wo du etwas hinsenden möchtest
    Text=Der Text vom Fenster(siehe:Title). Dies kann meistens auch "" sein
    ControlID=Die ControlID, die du vom WindowInfo-Tool kriegst z.B.: "Edit1"
    string=Die Zeichenfolge z.b.: "Hallo Welt"

    Damit sollte es eigentlich machbar sein.

    MfG
    Conan (Nur Mitlesend)
    Schon lange dabei