Abfrage: Teil des WindowTitle (Teil des Dateinamens eines OpenOffice-Dokumentes)

  • Hallo,

    ich will bestimmte Dateien, die so benannt sind, beim Öffnen in den Vordergrund bringen: *_001.odt
    Dabei soll die dreistellige Zahl von 001 bis 999 möglich sein. Die Titelzeile in OpenOffice Writer lautet dann so: "*_001.odt - OpenOffice.org Writer"

    Wenn ich das mit einer konkreten Datei namens "_001.odt" machen will, dann funktioniert das:

    [autoit]


    $b = "_001.odt"
    $i = "Vordergrund-Wächter aktiviert"
    While 1 * sleep(100)
    If WinExists($b) Then
    WinSetState($b, "", @SW_MAXIMIZE)
    WinSetOnTop($b, "", 0)
    WinActivate($b, "")
    WinSetTitle($b, "", $i)
    EndIf
    Wend

    [/autoit]

    Meine Versuche, das zu abstrahieren gehen soweit:

    [autoit]


    $i = "Vordergrund-Wächter aktiviert - SAP_OO"
    $t = "[CLASS:SALFRAME]"
    ; _001.odt - OpenOffice.org Writer
    ; Titelzeile von rechts: 32 Zeichen!
    While 1 * sleep(100)
    If WinExists ($t,"") Then
    $tit = WinGetTitle($t)
    $tit2 = StringRight($tit, 32)
    ; Unterstrich:
    $tit3 = StringLeft($tit2, 1)
    $tit4 = StringRight($tit, 28)
    ; .odt :
    $tit5 = StringLeft($tit4, 4)
    ; 3 Zahlen:
    $sid1 = StringRight($tit, 31)
    $sid2 = StringLeft($sid1, 3)
    ;Prüfen, ob die 3 Stellen links vom Punkt Zahlen sind
    $x = StringIsDigit($sid2)
    If $x = 1 AND $tit3 = "_" AND $tit5 = ".odt" Then
    WinSetState($tit, "", @SW_MAXIMIZE)
    WinSetOnTop($tit, "", 0)
    WinActivate($tit, "")
    WinSetTitle($tit, "", $i)
    Else
    ; $x = 0 also keine 3 Zahlen
    EndIf
    EndIf
    Wend

    [/autoit]

    Das macht das halbwegs. Nur muss erst nochmal ein anderes geöffnetes Dokument angeklickt werden. Es funktioniert also nicht, wie es soll...

    Dank und Gruß im Voraus!
    Thomas

    • Offizieller Beitrag

    Mit folgender Option werden auch Teile des Fensternamens erkannt:

    [autoit]

    Opt('WinTitleMatchMode', 2)

    [/autoit]

    Oder vielleicht hilft dir das hier. Damit erkennst du ob ein Fenster mit deinen Vorgaben (*_nnn.odt....) übereinstimmt.

    [autoit]

    If StringRegExp(WinGetTitle("[CLASS:SALFRAME]"), '_\d{3}\.odt - OpenOffice.org Writer') Then
    WinSetState("[CLASS:SALFRAME]", @SW_MAXIMIZE)
    EndIf

    [/autoit]
  • Ich habe gerade festgestellt, dass die Sache bei "normalen" *_001.odt" funktioniert. Das Dokument für das ich das geschrieben habe, lädt aber beim Dokumentöffnen eine interne DDE-Verknüpfung zu einer Calc-Datei (*.ods), die denselben Class-Namen hat (SALFRAME). Das müßte noch eindeutiger abgefragt werden ...

    • Offizieller Beitrag

    Dann mach die Abfrage so. Es ist dann egal ob mehrere Fenster mit dem CLASSNAME existieren. Nur wenn der Titel übereinstimmt führst du die Aktion aus.
    Nur laß das nicht ständig in einer Schleife laufen, sondern prüfe ob ein neues Fenster hinzugekommen ist (WinList) und mach dann die Abfrage.

    [autoit]

    $title = WinGetTitle("[CLASS:SALFRAME]")
    If StringRegExp($title, '_\d{3}\.odt - OpenOffice.org Writer') Then
    WinSetState($title, @SW_MAXIMIZE)
    EndIf

    [/autoit]
  • Weil ich die Änderung des Fenstertitels drin habe am Ende, sieht man jetzt genau, dass das Writer-Dokument öffnet, gleichzeitig - sonst unsichtbar - die DDE-Verknüpfung mit dem Calc-Dok hergestellt wird und hier passiert es nun gelegentlich:

    Das Calc-Fenster taucht kurz auf, der neue Titel, der für das Writer *.odt bestimmt ist, wird in die Fensterzeile des Calc-Fensters (*.ods) geschrieben und ein leeres graues Calc(!) -"Dokument" friert am Bildschirm ein.

    • Offizieller Beitrag

    Sry, bin etwas verwirrt. :huh:
    So wie du das jetzt ansprichst verstehe ich das nun so:
    - Ein neues Dokument heißt IMMER *_001.odt
    - Du möchtest dieses Dokument jetzt fortlaufend nummerieren (bis _999)
    - Das nun umbenannte Dokument soll (maximiert) in den Vordergrund gesetzt werden

    Wenn ja: Bedenken, dass für die interne fortlaufende Nummerierung mit _002 begonnen werden muß, damit keine Kollisionen mit den jeweils neuen _001 entstehen.

    Ist meine Problemschilderung so korrekt?

  • Grundsätzlich ist das Problem gut rübergekommen :) Das neue Dokument heißt nicht immer *_001.odt. Nur das erste Dokument in einem Ordner heißt so.

    Zitat

    Wenn ja: Bedenken, dass für die interne fortlaufende Nummerierung mit _002 begonnen werden muß, damit keine Kollisionen mit den jeweils neuen _001 entstehen.

    Die fortlaufende Nummerierung ist kein Problem. Das wird von einem externen Programm (SpeedAddressPro) vorgenommen, das jeden Ordner bezüglich der Zahlen ausliest und immer hochzählt. Die Vorlage heißt immer *_00.odt und wird erstmals nach dem Beschreiben "_001.odt" benannt. Usw. Ich will das an dieser Stelle aber nicht unnötig verkomplizieren... Das Problem ist wohl offensichtlich der Start der DDE-Verknüpfung, das bei eindeutigem Fensternamen nicht auftritt (statt dem Class-Namen).

    • Offizieller Beitrag

    Das Problem ist wohl offensichtlich der Start der DDE-Verknüpfung, das bei eindeutigem Fensternamen nicht auftritt (statt dem Class-Namen).


    Nein, das ist grundsätzlich kein Problem. Ich brauche nur ein Kriterium, mit dem eindeutig definiert ist: Dieses neue Dokument möchte ich verwenden.
    Das kann ein immer wiederkehrender und nur in diesem Dokumenttyp vorkommender Teil des Titels sein.

    Ich habe mal schnell ein Programm zur Prozessüberwachung umgemodelt auf Fensterüberwachung. Sollte hierfür funktionieren.
    Wenn du einen eindeutigen Titelbestandteil hast, kannst du das noch anpassen. Momentan ist es auf: Neues Dokument = _001.odt eingestellt.

    Spoiler anzeigen
    [autoit]

    Global $INI = @ScriptDir & '\oooDoc.ini', $counter ; für neue Programmstarts fortlaufenden Zähler speichern
    If Not FileExists($INI) Then IniWrite($INI, 'current', 'number', 1)
    $counter = IniRead($INI, 'current', 'number', 1)

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

    Global $oWin_old = ObjCreate("Scripting.Dictionary")
    Global $oWin_cur = ObjCreate("Scripting.Dictionary")
    Global $oWin_new = ObjCreate("Scripting.Dictionary")
    Global $aWin

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

    AdlibRegister('_setWin')
    HotKeySet('#!e', '_ende') ; WIN+ALT+e zum Beenden

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

    While True
    Sleep(100)
    WEnd

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

    Func _setWin()
    Local $ar = _GetNewWins("[CLASS:SALFRAME]", '_001\.odt - OpenOffice.org Writer')
    If $ar[0][0] = -1 Then Return
    For $i = 0 To UBound($ar) -1
    $counter += 1
    IniWrite($INI, 'current', 'number', $counter)
    $ar[$i][0] = StringReplace($ar[$i][0], '001', StringFormat('%03i', $counter))
    WinSetTitle($ar[$i][1], '', $ar[$i][0])
    WinSetState($ar[$i][0], '', @SW_MAXIMIZE)
    WinActivate($ar[$i][0])
    Next
    EndFunc

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

    Func _ende()
    AdlibUnRegister()
    Exit
    EndFunc

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

    Func _GetNewWins($class, $title)
    $aWin = WinList($class)
    For $i = 1 To UBound($aWin) -1
    If Not StringRegExp($aWin[$i][0], $title) Then ContinueLoop
    $oWin_cur.Add($aWin[$i][1], $aWin[$i][0])
    Next
    If $oWin_old.Count <> 0 Then
    If $oWin_new.Count > 0 Then $oWin_new.RemoveAll
    For $win In $oWin_cur.Keys
    If Not $oWin_old.Exists($win) Then $oWin_new.Add($win, $oWin_cur.Item($win))
    Next
    $oWin_old.RemoveAll
    Else
    _CopyList($oWin_cur, $oWin_new)
    EndIf
    _CopyList($oWin_cur, $oWin_old)
    $oWin_cur.RemoveAll
    Local $aOut[1][2] = [[-1]], $i = 0
    If $oWin_new.Count > 0 Then
    ReDim $aOut[$oWin_new.Count][2]
    For $win In $oWin_new.Keys
    $aOut[$i][0] = $oWin_new.Item($win)
    $aOut[$i][1] = $win
    $i += 1
    Next
    EndIf
    Return $aOut
    EndFunc ;==>_GetNewWins

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

    Func _CopyList(ByRef $oDictFrom, ByRef $oDictTo)
    For $key In $oDictFrom.Keys
    $oDictTo.Add($key, $oDictFrom.Item($key))
    Next
    EndFunc

    [/autoit]
  • Hi,

    vielen Dank für Deine Mühe!

    Aufs erste kommt eine Fehlermeldung (AutoIt-Error) in Zeile 33 der *.exe: "The requested action with this object has failed".

    Viele Grüße
    Thomas

  • Hallo BugFix,

    ein gutes neues Jahr erstmal!

    Ich habe in Deinem Script die _ende Funktion mal rausgenommen und stoße auf mehrere andere Probleme, die ich momentan leider nicht komplett übersehe. Grundsätzlich fehlen aber wohl Definitionen mehrerer Variablen...

    Viele Grüße
    Thomas