1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. BugFix

Beiträge von BugFix

  • Mausrad deaktivieren

    • BugFix
    • 30. September 2018 um 11:10

    Mit DllCallbackRegister eine eigene Maus-Procedure zur Bearbeitung der Mausevents erstellen (_MouseProc($nCode, $wParam, $lParam)).

    Du installierst einen Hook auf $WH_MOUSE_LL  (Funktion _WinAPI_SetWindowsHookEx).

    Wenn $nCode = $HC_ACTION und $wParam = $WM_MOUSEWHEEL dann:

    Ist deine GUI aktiv? - Nachricht verwerfen / sonst: Weiterleiten ans System

    Du siehst - nicht ganz trivial. Wenn du nicht alles richtig machst, ist die Wahrscheinlichkeit groß, dass du dein Programm und/oder Windows zum Absturz bringst.

    Deshalb habe ich auch keinen kpl. Code gepostet. Wenn du as nicht selbst umsetzen kannst: Lass die Finger davon!

  • StringFormat mit anderer Syntax

    • BugFix
    • 30. September 2018 um 10:48

    Xorianator

    Da hast du eigentlich Recht. Diese Maskierung ist ja sowieso für \ und % erforderlich.

    Ich habe jetzt die Maskierung dementsprechend integriert (\{  \}).

    Somit ist jede Art von Text möglich - und damit ist die Funktion auch für Jedermann einsetzbar.

  • StringFormat mit anderer Syntax

    • BugFix
    • 29. September 2018 um 15:32

    So, Problem von geschweiften Klammern im normalen Text gelöst: Einfach mit sich selbst maskieren: {{interner String mit geschweiften Klammern}}

  • StringFormat mit anderer Syntax

    • BugFix
    • 29. September 2018 um 09:39
    Zitat von alpines

    Wozu die geschweiften Klammern dahinter, deine UDF soll doch extra hinter dem Formatzeichen den Inhalt bekommen also sind die doch überflüssig.

    Und wie kann man ohne abgrenzende Zeichen feststellen, wo der Inhalt endet? Bsp.: "%02i" soll befüllt werden mit '$var +1' <-- solche Zuweisungen müssen möglich sein.

    Zitat von alpines

    Für dein Beispiel würde ich aber aber nicht StringFormat nehmen sondern viel lieber ExpandVarStrings, ist kürzer und liest sich besser

    Schreibe ich so undeutlich? - Mein Thread heißt doch "StringFormat mit anderer Syntax" und nicht: "Wie kann ich folgenden Bsp.-String ausgeben?"

    Mein Bsp. ist also kein Problem, das es zu lösen galt. Es ist nur ein willkürlich gewähltes Bsp. für eine Anwendung von StringFormat. Das wird vielleicht deutlicher, wenn du sowas umsetzen willst: StringFormat("[% 10s]\t%s", $s1, $s2).

    ExpandVarStrings ist nunmal wenig (oder besser gesagt gar nicht) geeignet um Strings zu formatieren. Weshalb du also Birnen in meine Schale mit Äpfeln wirfst und dann den besseren Geschmack von Birnen preist, entzieht sich meinem Verständnis.

    Zitat von alpines

    @Mon, @MDay, @Hour, @Min, @Sec muss man übrigens nicht formatten, die sind alle zweistellig

    Jein.

    Die Makros geben Strings der Länge 2 zurück (ggf. mit führender Null). Soweit hast du völlig recht.

    StringFormat legt aber fest, wie die Werte zu interpretieren sind. Ich bevorzuge schon, dass ich einen Ziffernwert (und das sind diese Makros inhaltlich) auch entsprechend formatiere. In diesem Fall also als %i. Damit würde aber ein Wert mit Vornull nur einstellig angezeigt werden. Somit ist die Anweisung %02i erforderlich. Man kann natürlich auch verlustfrei mit %s ausgeben, aber dann sind wir wieder bei der Nichtübereinstimmung von Inhalt und Format (auch wenn das in AutoIt leider keine Rolle spielt). Ist sicher eine Geschmackssache, die jeder auf seine Art handhabt.

    Zitat von Musashi

    Sehe ich das falsch, oder filtert deine Funktion auch 'normalen' Text in geschweiften Klammern heraus ?

    Da hast du, zu meiner Schmach, leider völlig Recht. Kam mir im Moment, als ich das erstellt habe leider nicht in den Sinn, dass diese Klammern auch normaler Text sein können. :Face:

    Einfach weglassen kann man Einfassungszeichen nicht (s. mein Kommentar zu Zitat #1). Da muss ich jetzt mal nach einer eleganten Lösung suchen. Ich möchte ja nicht unbedingt, dass zusätzlich Zeichen maskiert werden müssen, weil das dann vom normalen Handling abweicht.

  • StringFormat mit anderer Syntax

    • BugFix
    • 28. September 2018 um 19:42

    Ich verwende ja sehr gerne StringFormat. Ist deutlich übersichtlicher als eine Stringverkettung mit den vielen Wechseln zwischen & und Variablen/Text. Auch der Einsatz von verschiedenen Stringbegrenzern ist deutlicher zu handeln. Was mich etwas störte ist, dass bei Angabe vieler Variablen nicht auf Anhieb sichtbar ist, welche Variable zu welchem Format-Platzhalter gehört.

    Deshalb habe ich mir eine andere Version der Funktion erstellt (_StringFormat), in der die zugehörige Variable direkt im Anschluss an den Format-Platzhalter innerhalb einer geschweiften Klammer angegeben wird.

    Wundert euch nicht über den Variablennamen, den ich in der Funktion für die Zählvariable der Schleife verwendet habe: Hier musste ich sicherstellen, dass dies keine Variable sein kann, die vom Funktions-Anwender genutzt werden könnte.

    AutoIt
    ; Bsp:
     ; gewünschter String:
     ; [DATUM UHRZEIT] Der Prozeß "NAME-Prozeß" wurde von User 'NAME-User@Domain' gestartet.
    
     ; Variablen:
     ; DATUM & UHRZEIT  -- Makros
    Global $sNameProcess = 'EinProzeß'
     ; NAME-User@Domain -- Makros
    
     ; Lösung mit String-Verkettung:
     Global $sResult = '[' & @MDAY & '.' & @MON & '.' & @YEAR & ' ' & @HOUR & ':' & @MIN & ':' & @SEC & '] Der Prozeß "' & $sNameProcess & '" wurde von User ''' & @UserName & '@' & @LogonDomain & ''' gestartet.'
    ConsoleWrite($sResult & @CRLF)
    
    ; Lösung mit StringFormat
    $sResult = StringFormat('[%02i.%02i.%i %02i:%02i:%02i] Der Prozeß "%s" wurde von User ''%s@%s'' gestartet.', @MDAY, @MON, @YEAR, @HOUR, @MIN, @SEC, $sNameProcess, @UserName, @LogonDomain)
    ConsoleWrite($sResult & @CRLF)
    
    ; Lösung mit _StringFormat
    $sResult = _StringFormat('[%02i{@MDAY}.%02i{@MON}.%i{@YEAR} %02i{@HOUR}:%02i{@MIN}:%02i{@SEC}] Der Prozeß "%s{$sNameProcess}" wurde von User ''%s{@UserName}@%s{@LogonDomain}'' gestartet.')
    ConsoleWrite($sResult & @CRLF)
    
    ; Bsp. für Maskierung von geschweiften Klammern und Backslash im Textanteil
    $sResult = _StringFormat('[%02i{@MDAY}.%02i{@MON}.%i{@YEAR} %02i{@HOUR}:%02i{@MIN}:%02i{@SEC}] Hier ist ein String mit \{intern geschweiften Klammern und einfachem (\\) oder doppeltem (\\\\) darin\}.')
    ConsoleWrite($sResult & @CRLF)
    
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _StringFormat
    ; Description ...: Works like StringFormat, but with another syntax
    ; Syntax ........: _StringFormat($_sFormat)
    ; Parameters ....: $_sFormat            - In contrast to StringFormat, the variables are given inside curly braces directly
    ;                                         behind the associated format placeholders.
    ;                                         example: "[%010s]{$stringVar} %02i{$integerVar}"
    ; Return values .: The formatted string
    ; Note ..........: If it is necessary to use curly braces within the normal body, they must be masked with a backslash.
    ; Author ........: BugFix
    ; ===============================================================================================================================
    Func _StringFormat($_sFormat)
        $_sFormat = StringReplace(StringReplace(StringReplace($_sFormat, '"', '""'), '\{', Chr(1)), '\}', Chr(2))
        Local $aParam = StringRegExp($_sFormat, '\{([^\}]+)}', 3)
        Local $tmp, $sParam = '', $sFormat = StringRegExpReplace($_sFormat, '(\{[^\}]+})', '')
        $sFormat = StringReplace(StringReplace($sFormat, Chr(1), '{'), Chr(2), '}')
        For $__iCount_Execute_Param_Loop__ = 0 To UBound($aParam) -1
            $tmp = Execute($aParam[$__iCount_Execute_Param_Loop__])
            $sParam &= StringFormat('"%s"', $tmp) & ', '
        Next
        $sParam = StringTrimRight($sParam, 2)
        Local $sCmd = StringFormat('StringFormat("%s", %s)', $sFormat, $sParam)
        Local $sResult = Execute($sCmd)
        Return $sResult
    EndFunc  ;==>_StringFormat
    Alles anzeigen


    EDIT [29.09.2018]

    Wie @Musashi richtig bemerkt hat, habe ich völlig verpennt, dass der normale Textanteil ja auch geschweifte Klammern enthalten kann.

    Ich möchte ein Maskieren von Zeichen durch den Anwender möglichst vermeiden, weil dies dann vom Standardhandling der Funktion abweicht. Ich setz mich mal dran.

    EDIT 2 [29.09.2018]

    Ich habe mich jetzt dafür entschieden, dieses Problem analog zur Nutzung von Stringbegrenzern zu lösen: Man maskiert geschweifte Klammern einfach mit sich selbst. Also: {{interner String mit geschweiften Klammern}}

    EDIT 3 [30.09.2018]

    Richtiger Hinweis von Xori: Da im Text sowohl Backslash als auch Prozentzeichen bereits mit Backslash maskiert werden müssen, ist es sinnvoll diese Maskierung zu übernehmen.

    Somit: \{interner String mit geschweiften Klammern\}

  • ISN AutoIt Studio

    • BugFix
    • 28. September 2018 um 09:18
    Zitat von mep

    Falls direkt hinter der zu öffnenden Klammer weiterer Code ist, wäre es sinnvoll, wenn entweder die schließende Klammer nach diesem ist, oder nur die öffnende eingefügt wird und man sich um die Schließende selber kümmern muss.

    Ich weiß jetzt nicht, wie ISI360 das geregelt hat. Aber i.A. wird in Editoren die Möglichkeit eingeräumt, dass bei vorher markiertem Text und anschließendem Setzen einer Klammer/Hochkomma/Anführungszeichen der markierte Bereich eingefasst wird. (Ich habe das in SciTE so geregelt.) Teilweise ist es abhängig, ob von Ende zum Anfang markiert wird (dann Einfassen mit der öffnenden Klammer) oder auch umgekehrt. Da variieren die verschiedenen Editoren.

    Teste also mal: Markieren von hinten nach vorn + öffnende Klammer (oder beides entgegengesetzt)

  • Ich möchte gerne Notepad++ (NPP, Notepad Plus Plus) als Editor verwenden!?

    • BugFix
    • 27. September 2018 um 10:23

    Ich hatte vor Jahren mal probiert N++ für AutoIt fit zu machen (Notepad++ und AutoIt). Du kannst dann zwar alles Wesentliche mit dem Editor machen, aber du wirst niemals den vollen Funktionsumfang des SciTE Editors erreichen können.

    Ein Problem ist das Syntaxhighlighting, da N++ nur eine begrenzte Anzahl an Funktionen vorhalten kann, wenn ich mich recht erinnere. Das war auch der Hauptgrund, warum ich das Thema nicht weiter verfolgt habe.

  • Win 10 SSD 128 GB auf SSD 500 GB umziehen und kläglich gescheitert [gelöst]

    • BugFix
    • 23. September 2018 um 21:12

    Acronis TrueImage kann das. Die Trialversion kannst du 30 Tage nutzen - sollte reichen :P

  • GUIs IM Hintergrund halten

    • BugFix
    • 17. September 2018 um 10:34
    Zitat von Michi91

    Auch wenn ich nur schwebende Buttons hab, müssen die trotzdem permanent im Hintergrund bleiben.

    Na dann brauchst du nur ein paar Zeilen einfügen, die die Button-GUI in der Z-Order ganz unten platzieren:

    AutoIt
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    
    Global $aButton[5]
    
    $gui = GUICreate("Test Windows regions", 150, 150, @DesktopWidth-170, -1, $WS_POPUP, $WS_EX_TOPMOST)
    $aButton[0] = GUICtrlCreateButton("Button 1", 0, 0, 150)
    $aButton[1] = GUICtrlCreateButton("Button 2", 0, 30, 150)
    $aButton[2] = GUICtrlCreateButton("Button 3", 0, 60, 150)
    $aButton[3] = GUICtrlCreateButton("Button 4", 0, 90, 150)
    $aButton[4] = GUICtrlCreateButton("Exit", 0, 120, 150)
    GUISetState(@SW_SHOWNOACTIVATE, $gui)
    
    $aWin  = WinGetPos($gui)
    $tRect = _WinAPI_GetWindowRect($gui)
    
    ; Z-Order: unterste Position
    _WinAPI_SetWindowPos($gui, $HWND_BOTTOM, $aWin[0], $aWin[1], ($tRect.Right-$tRect.Left), ($tRect.Bottom-$tRect.Top), $SWP_NOACTIVATE)
    
    _GuiHole($gui, 0, 0, 150, 150)
    
    While 1
        $msg = GUIGetMsg()
        Switch $msg
            Case $aButton[4]
                ExitLoop
            Case $aButton[0]
                MsgBox(0, '', 'Button1 geklickt')
            Case $aButton[1]
                MsgBox(0, '', 'Button2 geklickt')
            Case $aButton[2]
                MsgBox(0, '', 'Button3 geklickt')
            Case $aButton[3]
                MsgBox(0, '', 'Button4 geklickt')
        EndSwitch
    WEnd
    
    Func _GuiHole($h_win, $i_x, $i_y, $i_sizew, $i_sizeh)
        Local $combined_rgn = _WinAPI_CreateRectRgn(0, 0, 0, 0)
        _AddCtrlRegion($combined_rgn, $aButton)
        _WinAPI_SetWindowRgn($h_win, $combined_rgn)
    EndFunc   ;==>_GuiHole
    
    Func _AddCtrlRegion($full_rgn, $ctrl_id)
        Local $ctrl_pos, $ctrl_rgn
        If IsArray($ctrl_id) Then
            For $i = 0 To UBound($ctrl_id) -1
                $ctrl_pos = ControlGetPos($gui, "", $ctrl_id[$i])
                $ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0], $ctrl_pos[1], $ctrl_pos[0] + $ctrl_pos[2], $ctrl_pos[1] + $ctrl_pos[3])
                _WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR)
                _WinAPI_DeleteObject($ctrl_rgn)
            Next
        Else
            $ctrl_pos = ControlGetPos($gui, "", $ctrl_id)
            $ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0], $ctrl_pos[1], $ctrl_pos[0] + $ctrl_pos[2], $ctrl_pos[1] + $ctrl_pos[3])
            _WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR)
            _WinAPI_DeleteObject($ctrl_rgn)
        EndIf
    EndFunc   ;==>_AddCtrlRegion
    Alles anzeigen
  • GUIs IM Hintergrund halten

    • BugFix
    • 15. September 2018 um 09:28

    Deinem Bsp. nach, möchtest du GUI erstellen, die als Button fungieren?? Da du diese als Child einer Haupt-GUI erstellst, kannst du doch auch gleich Button nutzen. Ich kann gerade nicht den Grund erkennen, warum du so vorgehen möchtest.

    Du kannst dir die GUI auch kpl. schenken und nur Button auf dem Desktop platzieren (steinaltes Bsp. von mir: "Schwebende" Button - Skriptbeispiel)

  • Excel xlsx datei erstellen ohne Excel zu benutzen

    • BugFix
    • 12. September 2018 um 18:09
    Zitat von djbeatstar

    wenn ich nun einen gazen haufen Daten (z.B. Die arbeitszeiten eines ganzen Jahres.) über ein AutoIt script in ein Exceldokument füttern will

    Wenn Excel sowieso das Ziel ist, würde ich nicht zwingend mit AutoIt arbeiten. Das integrierte VBA (auf das du mit der Excel UDF auch zugreifst) erledigt auch all das, was du mit AutoIt an Datenbearbeitung treibst. Und i.d.R dann natürlich auch deutlich schneller, da bereits alles in einer Umgebung abläuft.

    Für Kleinigkeiten ist die Verbindung AutoIt - Excel sicher eine top Lösung, da man sich nur mit der (vertrauten) AutoIt-Syntax befassen muss. Aber bei größeren Projekten, würde ich eine reine VBA-Lösung bevorzugen.

  • Frage ObjCreate

    • BugFix
    • 12. September 2018 um 13:45

    Ich bin zur Zt. nicht in der Firma und kann deshalb nicht nachsehen, wie das bei uns ist. Die Ablagestruktur ist ja individuell an deinen Bedarf angepasst. Bei uns ist das Hauptkriterium (oberste Ordnerstufe) der Kundenname. darunter sind Unterordner für Ablagetypen (getrennt nach Einkauf/Verkauf: Angebot, Auftrag, Lieferschein, Rechnung, Gutschrift, Storno) und dort die entsprechenden Dokumente. Wobei diese Ordner keine Rolle spielen, da ich alle Dokumente vor der Ablage automatisch eindeutig benenne, z.B. Verkaufsrechnung: VRE_ReNr_Druckdatum-Uhrzeit.pdf.

    Den Bezug zur Ablage-ID kann ich, wie gesagt, jetzt nicht nachsehen.

  • Frage ObjCreate

    • BugFix
    • 12. September 2018 um 11:59

    Wäre es da nicht besser, auf die ELO SQL-Datenbank zuzugreifen? Je nachdem, wie du deine Dokumente verschlagwortet hast, bekommst du dann alle Infos direkt als Feldinhalte deiner Abfragen und brauchst nicht extra Dokumente zwischenspeichern.

  • Frage ObjCreate

    • BugFix
    • 12. September 2018 um 11:21

    Du möchtest die Methoden und Eigenschaften abfragen? Das ist nur möglich, wenn der Entwickler das vorgesehen hat (z.B. wie in PowerShell mit get-member)

    Aber du kannst ja mal deinen ELO-Anbieter fragen, ob er die Info rausrückt. :whistling: - Was ich allerdings für wenig wahrscheinlich halte. Die Firma lebt ja davon Bedienungsoberflächen für das Produkt zu verkaufen. Wenn du selber drin rumfuhrwerkst, kannst du aber auch den Service vergessen. Ist wie ein gebrochenes Garantiesiegel.

    Ich weiß ja nicht, wie viel Arbeitsplätze du damit ausstatten möchtest. Aber die Read-Only-Lizenz (mit Suchfunktion) kostet so ca. 300 Euro. Keine Rieseninvestition in einer Firma. Da hast du mehr Aufwand deine Bastelei sauber zu implementieren und weiter anzupassen.

    Ich lasse da alles von meinem Anbieter machen. Service ist schnell und zuverlässig. Das Produkt ELO sowieso. :thumbup:

  • Datei runterladen mit autoit

    • BugFix
    • 10. September 2018 um 12:09

    Auch wenn die Daten im Ausland gespeichert sind, gilt Urheberrechtsschutz. Denn wenn die Daten frei zugänglich wären, würdest du sicher direkt beim Urheber downloaden und nicht von irgendeinem Webspace.

    Es gibt die Grauzone der privaten Kopie. Aber das sehe ich hier nicht gegeben.

    Und deshalb: CLOSED

  • Verschieben der Buttons einer Toolbar

    • BugFix
    • 1. September 2018 um 16:38

    Ich habe nicht viel Hoffnung, dass das möglich ist.

    Ich hatte vor Jahren mal versucht mit der Toolbar zu arbeiten. Aber die Toolbar, die wir hier erstellen können, ist nicht besonders überzeugend. Da gibt es so einige Bugs. Eine eigene Toolbar UDF zu erstellen, fehlte mir dann aber die Motivation.

  • Drag and Drop auf Toolbar

    • BugFix
    • 30. August 2018 um 10:07

    Ich würde etwa so vorgehen:

    - Permanent bei Öffnen eines Fensters prüfen, ob es der Explorer ist.

    --> Wenn ja: Verliert das Fenster den Fokus --> Auslesen welche Datei markiert ist. --> Folgt jetzt ein Datei-Drop-Event, kann es nur die gerade ausgelesene Datei sein.

    EDIT:

    Hier mal ein Bsp. wie du aus dem Explorer auslesen kannst.

    ACHTUNG: Mit Bibliotheken kann die Funktion nur bedingt umgehen. Dateinamen können gelesen werden, aber der Pfad zur Bibliothek nicht.

    AutoIt
    Local $a = _GetSelectionFromTopMostExplorer(False)
    ConsoleWrite($a[1] & @CRLF)
    
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _GetSelectionFromTopMostExplorer
    ; Description ...: Gets an array with selected files from the top most explorer window
    ; Syntax ........: _GetSelectionFromTopMostExplorer([$_bDir = True])
    ; Parameters ....: $_bDir       - [optional] Returns the full path (Default 'True'). With 'False' will only the filename returned.
    ; Return values .: Array with selected files. Counter at $ar[0]
    ; Requires.......: _GetTopmostHwndFromProcess()
    ; Author ........: BugFix
    ; ===============================================================================================================================
    Func _GetSelectionFromTopMostExplorer($_bDir=True)
        Local $oShell = ObjCreate("Shell.Application")
        Local $oIE, $sPath, $oShellWindows = $oShell.Windows
        Local $oDoc, $bIE = False, $oFV
        For $i = 0 To $oShellWindows.Count -1  ; all opened explorer and internet explorer windows
            $oIE = $oShellWindows($i)
            $oDoc = $oIE.Document
            If _GetTopmostHwndFromProcess('explorer.exe', 'CabinetWClass') = $oIE.Hwnd Then
                If StringRegExp(ObjName($oDoc), "IShellFolderViewDual.") Then       ; be sure it's the explorer object
                    $sPath =StringReplace(StringReplace(StringTrimLeft($oIE.LocationURL, 8), '%20', ' '), '/', '\') ; extract windows path from file-url
                    $bIE = True   ; flag: found explorer
                EndIf
            EndIf
        Next
        Local $aSelection[500] = [0]
        If $bIE Then
            $oFV = $oIE.Document             ; Datei-Browser (ShellFolderView)
            For $oFI In $oFV.SelectedItems   ; Markierte Elemente darin
                $aSelection[0] += 1
                If $aSelection[0] > UBound($aSelection) Then ReDim $aSelection[UBound($aSelection) +500]
                If Not $_bDir Then $sPath = ''
                $aSelection[$aSelection[0]] = StringFormat('%s%s',  $sPath, $oFI.Name)
            Next
        EndIf
        If $aSelection[0] = 0 Then
            ReDim $aSelection[1]
        Else
            ReDim $aSelection[$aSelection[0]+1]
        EndIf
        Return $aSelection
    EndFunc ;==>_GetSelectionFromTopMostExplorer
    
    
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _GetTopmostHwndFromProcess
    ; Description ...: Returns the handle of the top most window of a specific process
    ; Syntax ........: _GetTopmostHwndFromProcess($_vProcess)
    ; Parameters ....: $_vProcess           The Process name or PID
    ;                  $_sClass             The classname of windows that will created by the specific process
    ; Return values .: Success              The handle of the top most window
    ;                  Failure              0, set @error = 1 (process does not exists)
    ;                                              @error = 2 (there is no window for this)
    ; Author ........: BugFix
    ; ===============================================================================================================================
    Func _GetTopmostHwndFromProcess($_vProcess, $_sClass)
        Local $aProc[2][2] = [[1],['',$_vProcess]]
        If IsString($_vProcess) Then
            $aProc = ProcessList($_vProcess)
            If $aProc[0][0] = 0 Then
                Return SetError(1,0,0)
            EndIf
        Else
            If Not ProcessExists($_vProcess) Then Return SetError(1,0,0)
        EndIf
        Local $hWnd = 0, $aWin =  WinList('[CLASS:' & $_sClass & ']')
        If $aWin[0][0] = 0 Then Return SetError(2,0,0)
        Local $tPID = DllStructCreate("int")
        ; check only the first window, has highest z-order
        For $i = 1 To $aProc[0][0]
            DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $aWin[1][1], "ptr", DllStructGetPtr($tPID))
            If DllStructGetData($tPID,1) = $aProc[$i][1] Then Return $aWin[1][1]
        Next
        Return 0
    EndFunc ;==>_GetTopmostHwndFromProcess
    Alles anzeigen
  • SciTE - Internetsuche von Text aus Editor mit Auswahl Suchmaschine oder Suchseite

    • BugFix
    • 29. August 2018 um 23:07

    Nachtrag: Ich hatte die falsche Version hochgeladen, da war die Abwahl der Punkterkennung noch nicht enthalten - korrigiert.

  • SciTE - Internetsuche von Text aus Editor mit Auswahl Suchmaschine oder Suchseite

    • BugFix
    • 29. August 2018 um 22:53

    Ich hatte etwas Ähnliches bereits für das Suchen auf Seiten (AutoIt DE / ~EN und MSDN) erstellt. Aber dort war jedem Aufruf eine Funktion und somit ein Hotkey zugewiesen.

    Mit dem neuen Skript stehen zwei Funktionen zur Verfügung:

    InetSearch.Engine()

    Bei Aufruf wird eine Liste verfügbarer (in properties festgelegter) Suchmaschinen angezeigt. Der Suchbegriff (markierter Text od. Text indem der Cursor steht) wird in der gewählten Maschine gesucht.

    InetSearch.Site()

    Bei Aufruf wird eine Liste verfügbarer (in properties festgelegter) Suchseiten angezeigt. Der Suchbegriff wird in der Standardsuchmaschine (in properties festlegbar) auf der ausgewählten Seite gesucht.

    In einer weiteren Einstellung kann erlaubt werden, dass die Texterkennung auch Punkte findet, also Objektvariablen mit Eigenschaften oder Methoden.

    Das Skript abspeichern und in der Lua Startdatei laden.

    Beide Funktionen an Hotkeys eurer Wahl binden.

    InetSearch.lua
    Code
    -- TIME_STAMP   2018-08-29 22:31:47
    
    --[[
    
        This script publicates two functions
        - InetSearch.Engine()
          You can search for the selected/touched text in SciTE and can select a search engine of your choice.
    
        - InetSearch.Site()
          You can search for the selected/touched text in SciTE with a defined search engine and can select a search site of your choice.
    
        Copy this script in your Lua scripts folder.
        Call this file in the Lua startup: dofile("Full\\Path\\InetSearch.lua")
        Add
        in "SciTEUser.properties" the following properties with search engines and search sites of your choice:
    
        #~ Inet Search Settings
        #~ List of engines. "display-name,search-url" (if not set: google.com will used)
        #~ If only one entry exists, the selection box will not shown.
        Inet.Search.Engines= \
        Google,https://www.google.de/search?q=| \
        MetaGer,https://metager.de/meta/meta.ger3?focus=web&eingabe=| \
        Bing,https://www.bing.com/search?q=| \
        Ask,https://de.ask.com/web?q=| \
        Yandex,https://www.yandex.com/search/?text=
    
        #~ Engine for site based search
        #~ Use display name from engines list (if not set: google.com will used)
        Inet.Search.SearchOnSite.Engine=Google
    
        #~ List of sites for site based search. "display-name,site-url"
        #~ If not set, it searches without a special site.
        #~ If only one entry exists, the selection box will not shown.
        Inet.Search.SearchOnSite.Sites= \
        AutoIt DE,autoit.de| \
        AutoIt EN,autoitscript.com| \
        MSDN,msdn.microsoft.com
    
        #~ By default, words will detected without dots. (0)
        #~ You can allow dots, to detect object variables with properties or methods too.
        Inet.Search.Allow.Punctuation=1
    
        #~ Search commands
        #~ Search word from cursor with engine selection
        command.name.9.*=Search with engine selection
        command.9.*=dostring InetSearch.Engine()
        command.mode.9.*=subsystem:lua,savebefore:no
        command.shortcut.9.*=Ctrl+Shift+F8
    
        #~ Search word from cursor with search site selection
        command.name.5.*=Search with site selection
        command.5.*=dostring InetSearch.Site()
        command.mode.5.*=subsystem:lua,savebefore:no
        command.shortcut.5.*=Ctrl+Shift+F9
    
    --]]
    
    
    InetSearch = {}
    InetSearch.Handler = EventClass:new(Common)
    
    
    do
        ------------------------------------------------------------------------------------------------
        local engineFallback = "Google,https://www.google.com/search?q="  -- default search engine: "display-name,search-url"
        local search_type    = nil
        local engine_url     = nil
        local search_item    = nil
        local search_site    = nil
        local tableSelection = nil
        ------------------------------------------------------------------------------------------------
    
        ------------------------------------------------------------------------- Load library protected
        local require_protected = function(_lib)
            local loaded_lib
            if pcall(function() loaded_lib = require(_lib)  end) then return loaded_lib
            else return nil end
        end --> require_protected
        ------------------------------------------------------------------------------------------------
        local shell = require_protected("shell")                    -- loads the shell library if exists
        ------------------------------------------------------------------------------------------------
    
        ------------------------------------------------------------------------------ Starts the search
        local RunSearch  = function(_item, _url, _site)
            local sSite = ''
            if _site ~= nil then sSite = "%20site:".._site end
            local sCmd = _url.._item..sSite
            if shell then shell.exec(sCmd)
            else os.execute('start "" "'..sCmd..'"') end
        end --> RunSearch
        ------------------------------------------------------------------------------------------------
    
        ----------------------------------------------------------------------------- Show the user list
        local ShowSelectionList = function()
            -- create the selection list (display names from engines or sites)
            local sep, list = '_', tableSelection[1][1]
            for i = 2, #tableSelection do
                list = list..sep..tableSelection[i][1]
            end
            local sep_tmp = editor.AutoCSeparator
            editor.AutoCSeparator = string.byte(sep)
            editor:UserListShow(16, list)
            editor.AutoCSeparator = sep_tmp
        end --> ShowSelectionList
        ------------------------------------------------------------------------------------------------
    
        --------------------------------------------------------------------------- Select the user list
        function InetSearch.Handler:OnUserListSelection(_tp, _sel)
            if _tp == 16 then
                local url
                for i = 1, #tableSelection do
                    if tableSelection[i][1] == _sel then
                        url = tableSelection[i][2]
                        break
                    end
                end
                if search_type == 'site' then
                    search_site = url
                else
                    search_site = nil
                    engine_url = url
                end
                RunSearch(search_item, engine_url, search_site)
            end
        end
        ------------------------------------------------------------------------------------------------
    
        --------------------------------------------------------- List of search engines from properties
        local GetEngines = function()
            local sEngines = props['Inet.Search.Engines']
            -- without settings, the default search engine will used
            if sEngines == '' then sEngines = engineFallback end
            local tEngines = {}
            for entry in sEngines:gmatch('([^|]+)|-') do
                for name, url in entry:gmatch('([^,]+),(.+)') do
                    table.insert(tEngines, {name, url})
                end
            end
            return tEngines
        end --> GetEngines
        ------------------------------------------------------------------------------------------------
    
        ----------------------------------------------------------- List of search sites from properties
        local GetSearchSites = function()
            local sSites = props['Inet.Search.SearchOnSite.Sites']
            if sSites == '' then return nil end
            local tSites = {}
            for entry in sSites:gmatch('([^|]+)|-') do
                for name, url in entry:gmatch('([^,]+),(.+)') do
                    table.insert(tSites, {name, url})
                end
            end
            return tSites
        end --> GetSearchSites
        ------------------------------------------------------------------------------------------------
    
        -------------------------------------------------------------------------------- Get search item
        local GetSearchItem = function()
            local sSelect = editor:GetSelText()
            if sSelect ~= '' then return sSelect end
    
            local allowDots = false
            if props['Inet.Search.Allow.Punctuation'] == '1' then allowDots = true end
    
            local caret = editor.CurrentPos
            local iLine = editor:LineFromPosition(caret)
            local iZero = editor:PositionFromLine(iLine)
            editor:LineEnd()
            local iLineEnd = editor.CurrentPos
            editor.CurrentPos = caret
            editor:SetSelection(caret,caret)
    
            local iStart = editor:WordStartPosition(caret)
            if allowDots then
                while iStart > iZero and editor:textrange(iStart -1, iStart) == '.' do
                    iStart = editor:WordStartPosition(iStart -1)
                end
            end
            local iEnd = editor:WordEndPosition(caret)
            if allowDots then
                while iEnd < iLineEnd and editor:textrange(iEnd, iEnd +1) == '.' do
                    iEnd = editor:WordEndPosition(iEnd +1)
                end
            end
            sSelect = editor:textrange(iStart, iEnd):gsub('^([^%w]+)', ''):gsub('([^%w]+)$', '')
    
            return sSelect
        end --> GetSearchItem
        ------------------------------------------------------------------------------------------------
    
        ------------------------------------------------------------------- Search with engine selection
        local SearchEngineBased = function()
            search_type = 'engine'
            search_item = GetSearchItem()
            if search_item == '' then return nil end
            tableSelection = GetEngines()
            -- only one entry: selection box will not shown
            if #tableSelection == 1 then
                RunSearch(search_item, tableSelection[1][2], nil)
            else
                ShowSelectionList()
            end
    
        end --> SearchEngineBased
        ------------------------------------------------------------------------------------------------
    
        -------------------------------------------------------------- Search with search site selection
        local SearchSiteBased = function()
            search_type = 'site'
            search_item = GetSearchItem()
            if search_item == '' then return nil end
            -- get the default engine for site based searching
            for _, url in engineFallback:gmatch('([^,]+),(.+)') do
                engine_url = url
            end
            -- if is set, use search engine from properties
            local sEngine = props['Inet.Search.SearchOnSite.Engine']
            if sEngine ~= '' then
                local tEngines = GetEngines()
                for i = 1, #tEngines do
                    if tEngines[i][1] == sEngine then
                        engine_url = tEngines[i][2]
                        break
                    end
                end
            end
            tableSelection = GetSearchSites()
            -- if none entries for search sites, use simple search
            if tableSelection == nil then
                RunSearch(search_item, engine_url, nil)
            else
                -- only one entry: selection box will not shown
                if #tableSelection == 1 then
                    RunSearch(search_item, engine_url, tableSelection[1][2])
                else
                    ShowSelectionList()
                end
            end
        end --> SearchSiteBased
        ------------------------------------------------------------------------------------------------
    
        ---------------------------------------------------------------------------- Publicate functions
        InetSearch.Engine = SearchEngineBased
        InetSearch.Site = SearchSiteBased
        ------------------------------------------------------------------------------------------------
    end
    ----------------------------------------------------------------------------------------------------
    Alles anzeigen

    Dateien

    InetSearch.lua 9,28 kB – 618 Downloads
  • SciTE - Skriptaufrufe anpassen an geänderte SciTE Version

    • BugFix
    • 28. August 2018 um 13:11

    Ich habe nach langem mal wieder SciTE aktualisiert (habe 2-3 Versionen übersprungen). Ich wollte bei der Gelegenheit mal Aufräumen und habe nicht drüber, sondern neu installiert.

    Für meine Zwecke muss ich immer Änderungen in der SciTEStartup.lua vornehmen. Geht in SciTE wegen fehlender Rechte nicht mehr, ich muss also NP++ als Admin starten um das zu bearbeiten.

    Relativ neu ist, dass im Startup Skript PersonalTools.lua geladen wird. Der Gedanke ist ja nicht verkehrt, aber das hieße, alle eigenen Skripte (speziell die Events darin) auf die EventClass PersonalTools anzupassen. Ist mir zuviel Arbeit und raubt mir auch die Übersicht, wenn alles in einer Klasse existiert.

    Ich bleibe also bei meiner alten Arbeitsweise und habe jetzt nur ergänzt, um ein Skript, das die bisher in SciTEStartup.lua enthaltenen Aufrufe sammelt und an einem Ort gespeichert ist, wo ScITE auch Schreibrechte hat, also vorzugsweise der selbst angelegte Ordner für eigene Lua Skripte (property: "Lua.User.Scripts.Path")

    Das Aufrufskript habe ich LuaUserScriptsLoad.lua genannt. Es enthält alle Aufrufe, die bisher im Lua Startskript unterhalb von EventClass:BeginEvents eingetragen waren.

    Bei mir sieht das so aus:

    LuaUserScriptsLoad.lua
    Code
    do
        LoadUserLuaFile("AutoStampSaveVersion.lua")   -- Timpe-Stamp, Version Management
        LoadUserLuaFile("ContinuousComments.lua")     -- Aligned Comments
        LoadUserLuaFile("EdgingSelection.lua")        -- Paired Characters, Auto array declaration from selected values
        LoadUserLuaFile("Ownhotkeys.lua")             -- Activates OwnHotkeys
        LoadUserLuaFile("MySciTETools.lua")           -- My SciTE-Tools
        LoadUserLuaFile("CodeAsHtml.lua")             -- Au3 To HTML
        LoadUserLuaFile("SelectStatement.lua")        -- Selected code set in statement
        LoadUserLuaFile("ShowHexColorFromCursor.lua") -- Displays colors inside SciTE
        LoadUserLuaFile("CommentAutoPos.lua")         -- Comments behind code in line starts automatically at given column
        LoadUserLuaFile("ReplTabWithSpaces.lua")      -- Inserts spaces while hit the TAB, with Backspace delete count spaces for Tab width
        LoadUserLuaFile("CompletePath.lua")           -- Explorer zur Ordner-/Dateiauswahl
        LoadUserLuaFile("new_as_utf8bom.lua")         -- Neue Datei als UTF8+BOM markieren
        -- LoadUserLuaFile("MultiPosWrite.lua")          -- an mehreren Positionen denselben Text schreiben
        -- LoadUserLuaFile("LuaObj_Test.lua")           -- TEST
        -- LoadUserLuaFile("test_   run.lua")           -- TEST
    end
    Alles anzeigen

    Das Lua Startskript ist jetzt einmalig mit allem Notwendigen angepasst und braucht dann nicht mehr bearbeitet werden.

    SciTEStartup.lua
    Code
    --------------------------------------------------------------------------------
    -- SciTE startup script.
    --------------------------------------------------------------------------------
    
    local sUserLua = props["Lua.User.Scripts.Path"]
    
    LUA_USER_PATH = sUserLua .. "\\?.dll;" .. sUserLua .. "\\?\\?.dll;"
    package.cpath = LUA_USER_PATH .. package.cpath
    
    LUA_USER_LUA = sUserLua .. "\\?.lua;" .. sUserLua .. "\\?\\?.lua;"
    package.path = LUA_USER_LUA .. package.path
    
    -- A table listing all loaded files.
    LoadLuaFileList = { }
    
    --------------------------------------------------------------------------------
    -- LoadLuaFile(file, directory)
    --
    -- Helper function for easily loading Lua files.
    --
    -- Parameters:
    --    file - The name of a Lua file to load.
    --    directory - If specified, file is looked for in that directory.  By default,
    --         this directory is $(SciTEDefaultHome)\Lua.
    --------------------------------------------------------------------------------
    function LoadLuaFile(file, directory)
        if directory == nil then
            directory = props["SciteDefaultHome"] .. "\\Lua\\"
        end
        table.insert(LoadLuaFileList, directory .. file)
        dofile(directory .. file)
    end    -- LoadLuaFile()
    --------------------------------------------------------------------------------
    
    -- Load all the Lua files.
    LoadLuaFile("Class.lua")    -- Always load first.
    LoadLuaFile("Common.lua")    -- Always load second.
    LoadLuaFile("AutoItPixmap.lua")
    LoadLuaFile("AutoHScroll.lua")
    LoadLuaFile("AutoItAutoComplete.lua")
    LoadLuaFile("LUAAutoComplete.lua")
    LoadLuaFile("LoadSession.lua")
    LoadLuaFile("AutoItIndentFix.lua")
    LoadLuaFile("EdgeMode.lua")
    LoadLuaFile("SmartAutoCompleteHide.lua")
    LoadLuaFile("Tools.lua")
    LoadLuaFile("AutoItTools.lua")
    LoadLuaFile("AutoItGotoDefinition.lua")
    LoadLuaFile("SciTE_extras.lua")
    if os.getenv("SCITE_USERHOME") ~= nil then
        f = io.open(os.getenv("SCITE_USERHOME") .. "\\PersonalTools.lua")
        if f ~= nil then
            LoadLuaFile("PersonalTools.lua",os.getenv ("SCITE_USERHOME") .. "\\")
            f:close()
        end
    else
        f = io.open(os.getenv("USERPROFILE") .. "\\PersonalTools.lua")
        if f ~= nil then
            LoadLuaFile("PersonalTools.lua",os.getenv ("USERPROFILE") .. "\\")
            f:close()
        end
    end
    
    -- Start up the events (Calls OnStartup()).
    EventClass:BeginEvents()
    
    --------------------------------------------------------------------------------
    --  Calls LoadLuaFile() with directory from Lua-User-Script property
    --------------------------------------------------------------------------------
    function LoadUserLuaFile(file)
        LoadLuaFile(file, props["Lua.User.Scripts.Path"] .. "\\")
    end    -- LoadUserLuaFile()
    --------------------------------------------------------------------------------
    
    LoadUserLuaFile("LuaUserScriptsLoad.lua")
    Alles anzeigen

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™