fenster im hintergrund bedienen

  • moin

    ich hab ein programm welches regelmäßig diverse informationen an ein editof-fenster sendet

    jetz hab ich dummerweise gestern wärend ich eine rauchen war jemandem der mich im falschen moment via icq angeschrieben hat knapp zehn minuten mit statusmeldungen von nem programm überschüttet die ihn irgendwie nich so brennend interessiert hatten ;)

    kann ich daten an ein bestimmtes nicht aktives fenster senden (nach möglichkeit ohne das fenster dazu aktivieren zu müssen ^^) - hätte nebenbei noch den vorteil dass man während das prog läuft was anderes machen kann ;)

    ... aso ^^ - und kann ich irgendwie anstatt jedes zeichen einzeln einen ganzen string an den editor senden? ^^

    Einmal editiert, zuletzt von sataan1337 (18. Oktober 2008 um 17:49)

  • aso ^^ falls von interesse - die datei sieht dann etwa so aus:

    ...
    60% - 94140 zeilen - 0 gefunden
    61% - 95709 zeilen - 0 gefunden
    62% - 97278 zeilen - 1 gefunden
    63% - 98847 zeilen - 5 gefunden
    64% - 100416 zeilen - 7 gefunden
    65% - 101985 zeilen - 17 gefunden
    ...^^

  • Hi,
    benutz ControlSend.
    Aber auch mit dem einfachen Send-Befehl musst du nicht nur einzelne Zeichen senden sondern kannst auch Zeichenketten Senden!

    [autoit]

    Run("notepad.exe")
    WinWaitActive("[CLASS:Notepad]")
    Send("..." & @CRLF & "60% - 94140 zeilen - 0 gefunden" & @CRLF & "61% - 95709 zeilen - 0 gefunden" & @CRLF & "62% - 97278 zeilen - 1 gefunden" & @CRLF & "63% - 98847 zeilen - 5 gefunden" & @CRLF & "64% - 100416 zeilen - 7 gefunden" & @CRLF & "65% - 101985 zeilen - 17 gefunden" & @CRLF & "...")

    [/autoit]

    Mit ControlSend:

    Spoiler anzeigen
    [autoit]

    Opt("SendKeyDelay",0)
    Opt("SendKeyDownDelay",0)

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

    Run("notepad.exe")
    WinWait("[CLASS:Notepad]")
    WinSetState("[CLASS:Notepad]", "", @SW_MINIMIZE)
    ControlSend("[CLASS:Notepad]", "", 15, "..." & @CRLF & "60% - 94140 zeilen - 0 gefunden" & @CRLF & "61% - 95709 zeilen - 0 gefunden" & @CRLF & "62% - 97278 zeilen - 1 gefunden" & @CRLF & "63% - 98847 zeilen - 5 gefunden" & @CRLF & "64% - 100416 zeilen - 7 gefunden" & @CRLF & "65% - 101985 zeilen - 17 gefunden" & @CRLF & "...")

    [/autoit]
  • Oder auch mit FileWriteLine alles in eine Datei schreiben :)
    Oder ein eigenes Fenster machen.

    Spoiler anzeigen
    [autoit]

    #include <GUIEdit.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    $LOGFILEPATH = @ScriptDir & "\LogFile.txt"
    GUICreate("My Log",400,400)
    $DeleteLog = GUICtrlCreateButton("Clear",10,0,100,30)
    $OpenInNotePad = GUICtrlCreateButton("Open in Notepad",120,0,100,30)
    $MyEdit = GUICtrlCreateEdit(FileRead($LOGFILEPATH),0,40,400,360,BitOR($GUI_SS_DEFAULT_EDIT,$ES_READONLY))
    GUISetState()
    AdlibEnable("AddLine",1000)

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

    While 1
    Switch GUIGetMsg()
    Case $DeleteLog
    FileDelete($LOGFILEPATH)
    GUICtrlSetData($MyEdit,"")
    Case $OpenInNotePad
    Local $LOGFILEPATHDIR = StringLeft($LOGFILEPATH,StringInStr($LOGFILEPATH,"\",1,-1))
    ShellExecute("notepad",'"' & $LOGFILEPATH & '"',$LOGFILEPATHDIR)
    Case -3
    Exit
    EndSwitch
    WEnd

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

    Func AddLine()
    Local $line = @HOUR & ":" & @MIN & ":" & @SEC
    _GUICtrlEdit_AppendText($MyEdit,$line & @CRLF)
    FileWriteLine($LOGFILEPATH,$line)
    EndFunc

    [/autoit]
  • also ^^ mit dem controlsend hab ichs mal probiert - hab da ein paar merkwürdige probleme ;)

    Code
    for $j = 1 to 100		if $10 * $j = $i Then			ControlSend("[CLASS:Notepad]", "", 15,$j& "% - " & $i & " zeilen - " & $counter &"gefunden{ENTER}" );			Send($j& "% - " & $i & " zeilen - " & $counter &"gefunden{ENTER}")			EndIf		Next

    das is ein auszug meines programmcodes
    das programm liest eine textdatei ein und verwertet jede zeile

    $i = zeile die gerade verwertet wird
    $10 = 1% der gesamtzeilen (gerundet auf ganze zahl)
    $j = prozent (läuft durch von 1 bis 100 in der schleife)


    problem ist jetz folgendes:

    wenn ich es normal durchlaufen lasse (mit der gerade auskommentierten zeile anstelle des controlsend) sieht die ausgabe folgendermaßen aus:

    village.txt wird eingelesen
    156882 datensätze werden bearbeitet
    1% - 1569 zeilen - gefunden
    2% - 3138 zeilen - gefunden
    3% - 4707 zeilen - gefunden
    4% - 6276 zeilen - gefunden
    5% - 7845 zeilen - gefunden

    wenn ich es so durchlaufen lasse wie im quelltext (also mit dem controlsend) siehts so aus:

    village.txt wird eingelesen
    156882 datensätze werden bearbeitet
    15 - 1569 zeilen - gefunden
    25 - 3138 zeilen - gefunden
    35 - 4707 zeilen - gefunden
    45 - 6276 zeilen - gefunden

    so und jetz kommt etwas was mich komplett verwirrt:
    wenn ich die controlsend zeile folgendermaßen manipuliere:

    Code
    ControlSend("[CLASS:Notepad]", "", 15,"..." & $j& "% - " & $i & " zeilen - " & $counter &"gefunden{ENTER}" )

    kommt folgendes raus (man beachte die vierte zeile):

    village.txt wird eingelesen
    156882 datensätze werden bearbeitet
    ...15 - 1569 zeilen - gefunden
    ...2% - 3138 zeilen - gefunden
    ...35 - 4707 zeilen - gefunden
    ...45 - 6276 zeilen - gefunden
    ...55 - 7845 zeilen - gefunden
    ...65 - 9414 zeilen - gefunden

    warum wird des nicht so ausgegeben wie es eigendlich sollte? ;)

  • @ progandy :des werd ich einbauen wenn das prog fertig is aber ich möcht erstmal wärend er arbeitet sehen wo er grad is ;)

  • grad nochmal was verändert an der zeile 8| und komm jetz garnimmer mit ;)

    wenn ich die controlsend zeile folgendermaßen verändere:

    Code
    ControlSend("[CLASS:Notepad]", "", 15,"..." & $j& " % - " & $i & " zeilen - " & $counter &"gefunden{ENTER}" )


    (ein leerzeichen vor das %)
    gibt er folgendes aus (dass er das % durch ne 5 ersetzt is mir schon aufgefallen - man beachte hier aber die neunte zeile):

    village.txt wird eingelesen
    156882 datensätze werden bearbeitet
    ...1 5 - 1569 zeilen - gefunden
    ...2 5 - 3138 zeilen - gefunden
    ...3 % - 4707 zeilen - gefunden
    ...4 5 - 6276 zeilen - gefunden
    ...5 5 - 7845 zeilen - gefunden
    ...6 5 - 9414 zeilen - gefunden
    .::/ % - 10983 zeilen - gefunden
    ...8 5 - 12552 zeilen - gefunden
    ...9 5 - 14121 zeilen - gefunden
    ...10 5 - 15690 zeilen - gefunden

    irgendwie spielt der mir dabei mit der shift-taste rum 8| und ich erkenn weder warum noch nach welchem schema

  • Versuch doch mal die Shift-taste manuell zu senden:

    [autoit]

    "{LSHIFT down}5{LSHIFT up}"

    [/autoit]
  • viel isses nich was er im editor ausgiebt ;) nur die prozente eben - und ne information in welchem programmteil er sich grad befindet (lese xyz ein usw) - das prog braucht im ganzen atm etwa ne stunde zum durchlaufen da fällt die ausgabe im editor nich weiter auf ^^

    und irgendwie musses ja gehen ;)

  • @progandy

    hilft auch nicht - gleiche ausgabe

    wenn ich das shiftdown/up weglasse (also nur 5) auch die gleiche ausgabe

  • und warum muss es der Editor sein? einfach am Anfang deines Skripts die GUI erstellen und dann einfach AppendText.
    Also, einfachstes Fenster, das am Anfang des Skripts

    [autoit]

    #include <GUIEdit.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    GUICreate("My Log",400,400)
    $MyEdit = GUICtrlCreateEdit(FileRead($LOGFILEPATH),0,40,400,360,BitOR($GUI_SS_DEFAULT_EDIT,$ES_READONLY))
    GUISetState()

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

    Func AddLine($line) ; OHNE Zeilenumbruch übergeben
    _GUICtrlEdit_AppendText($MyEdit,$line & @CRLF)
    EndFunc

    [/autoit]


    und später statt ControlSned AddLine :)
    Am Ende des Sripts noch speichern und in Notepad anzeigen.

    [autoit]

    Func OnAutoItExit()
    FileWrite(@ScriptDir&"\LogFile.txt",GUICtrlRead($MyEdit))
    Shellexecute(@ScriptDir&"\LogFile.txt")
    EndFunc

    [/autoit]
  • wenn es das macht was ich denke dass es machen soll isses ne gute idee ;)
    probier ich gleich mal ^^ - hab mich mit den gui sachen noch nich befasst ^^

  • es macht was ich dachte dass es tun würde ;) danke dir vielmals^^


    frage am rande:
    "Dieser Beitrag wurde bereits 23,78 mal editiert, zuletzt von »progandy«"

    wie kannst du deinen beitrag 23,78 mal editieren ? 8|

    Einmal editiert, zuletzt von sataan1337 (18. Oktober 2008 um 17:54)

  • aso ;)

    frage kurz zum speichern ;)

    hab das 1:1 übernommen - wenn ich das script abbreche erstellt er die datei auch, schreibt aber nur ne "0" rein

    *edit*
    er schreibt keine "0" rein, er hängt sie an das vorherige dokument an ;)

    wenn des logfile vorher so aussieht:
    0

    dann nachher so:
    00

    wenns vorher so aussieht:
    00blablubb

    dann nachher so:
    00blablubb0

    Einmal editiert, zuletzt von sataan1337 (18. Oktober 2008 um 18:25)

  • Hmm, irgendwie wird die GUI schon vor OnAutoItExit gelöcht, ka, warum :(
    Also, mach es einfach so:

    Spoiler anzeigen
    [autoit]

    Func _Exit()
    FileWrite(@ScriptDir&"\LogFile.txt",GUICtrlRead($MyEdit))
    Shellexecute(@ScriptDir&"\LogFile.txt")
    Exit
    EndFunc

    [/autoit]


    und rufe am Ende vom Skript _Exit() auf. und im Skript verwende _Exit() statt Exit :)

  • thx ^^

    kann ich des irgendwie einbauen dass er bei nem vorzeitigen programmabbruch des auch speichert (beim beenden vom script über des trayicon oder bei nem programmfehler) ?

  • Du kannst ja einfach bei jedem Log-Eintrag gleich in die Datei schreiben:

    [autoit]

    Func AddLine($line) ; OHNE Zeilenumbruch übergeben
    _GUICtrlEdit_AppendText($MyEdit,$line & @CRLF)
    FileWriteLine(@ScriptDir&"\LogFile.txt",$line)
    EndFunc

    [/autoit]


    und doch wieder in OnAutoItExit das shellexecute, aber nicht mehr FileWrite.