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. Bitnugger

Beiträge von Bitnugger

  • _Singleton Fensterhandle

    • Bitnugger
    • 11. September 2020 um 09:10
    Zitat von Banana_2_Day

    Nur 10 Zeichen lang - sowas würde ich gerne für meine Scripte verwenden.

    Das kannst du mit _WinAPI_ComputeCrc32 machen...

    AutoIt
    ;-- TIME_STAMP   2020-09-11 08:49:58   v 0.1
    
    #include <WinAPISys.au3> ; _WinAPI_ComputeCrc32
    
    Global Enum $eString, $eFile
    
    Global $iCrc32 = _GetCrc32(@ScriptFullPath, $eFile)
    If @error Then Exit @error
    ConsoleWrite('> $iCrc32          = ' & $iCrc32 & @CRLF)
    ConsoleWrite('> Hex($iCrc32)     = ' & Hex($iCrc32) & @CRLF)
    For $i = 8 To 16 Step 1
        ConsoleWrite(StringFormat(($i < 11 ? '+' : '-') & ' Hex($iCrc32, %2i) = %s\n', $i, Hex($iCrc32, $i)))
    Next
    
    Func _GetCrc32($sString, $iType = $eString)
        If $sString = '' Then Return SetError(1, 0, '')
        If $iType = $eFile Then $sString = FileRead($sString)
        If @error Then Return SetError(2, 0, '')
        Local $iLength = StringLen($sString), $tCrc32 = DllStructCreate('char Crc32[' & $iLength & ']')
        If @error Then Return SetError(3, 0, '')
        DllStructSetData($tCrc32, 'Crc32', $sString)
        Local $pMemory = DllStructGetPtr($tCrc32)
        Local $iCrc32 = _WinAPI_ComputeCrc32($pMemory, $iLength)
        Return $iCrc32 ? $iCrc32 : SetError(4, 0, '')
    EndFunc   ;==>_GetCrc32
    Alles anzeigen
    Code: Ausgabe
    > $iCrc32          = 3363262718
    > Hex($iCrc32)     = 00000000C87750FE
    + Hex($iCrc32,  8) = C87750FE
    + Hex($iCrc32,  9) = 0C87750FE
    + Hex($iCrc32, 10) = 00C87750FE
    - Hex($iCrc32, 11) = 000C87750FE
    - Hex($iCrc32, 12) = 0000C87750FE
    - Hex($iCrc32, 13) = 00000C87750FE
    - Hex($iCrc32, 14) = 000000C87750FE
    - Hex($iCrc32, 15) = 0000000C87750FE
    - Hex($iCrc32, 16) = 00000000C87750FE
    Alles anzeigen
  • Excel+dazugehörige Fehlermeldungen schließen

    • Bitnugger
    • 10. September 2020 um 23:19

    Hm, ich erkenne den Sinn des Scripts nicht... du startest Excel, falls nicht schon passiert, öffnest eine Arbeitsmappe, wartest 35 (nicht 20) Sekunden, und beendest Excel dann wieder, ohne auch nur einmal auf die Arbeitsmappe zuzugreifen. Wofür soll das gut sein und was willst du mit dem Script bezwecken?

    Zudem denke ich, sollte es reichen, wenn du Excel nicht alle 35 Sekunden beendest, sondern lediglich die Arbeitsmappe schließt und wieder öffnest.

    Ansonsten setze mal bei _Excel_Close den 2. Parameter ($bForceClose) auf True...

    _Excel_Close($oExcel, True, True) ; $bSaveChanges = True, $bForceClose = True

    ...und evtl. bei _Excel_BookOpen dén letzten Parameter ($bUpdateLinks) auf 3.

    _Excel_BookOpen($oExcel, $sWorkbook, False, True, Default, Default, 3)

    Oder teste mal hier das Bsp. mit AdlibRegister:

    AutoIt
    ;-- TIME_STAMP   2020-09-10 23:14:25   v 0.1
    
    ;~ #include <MsgBoxConstants.au3>
    #include <Excel.au3>
    ;~ #include <IE.AU3>
    
    Opt('MustDeclareVars', 1)
    
    Global $oExcel, $oWorkbook, $sWorkbook = 'F:\Eigene Dateien\TxT\Spalten_Sortieren.xlsm'
    
    #cs
        _Excel_Open ( [$bVisible = True [, $bDisplayAlerts = False [, $bScreenUpdating = True [, $bInteractive = True [, $bForceNew = False]]]]] )
                $bVisible        [optional] True gibt an, dass das Programm sichtbar sein wird (Standard = True)
                $bDisplayAlerts  [optional] False unterdrückt alle Aufforderungsmeldungen und Fehlermeldungen, während ein Arbeitsbuch geöffnet wird (Standard = False)
                $bScreenUpdating [optional] False unterdrückt Bildschirmupdates um das Script zu beschleunigen (Standard = True)
                $bInteractive    [optional] Wenn False, blockiert Excel alle Tastatur- und Mauseingaben der Nutzer (ausgenommen den Input von Dialogfeldern) (Standard = True)
                $bForceNew       [optional] True erzwingt, dass eine neue Excel-Instanz erstellt wird, auch wenn es bereits eine laufende Instanz gibt (Standard = False)
        
        _Excel_BookOpen ( $oExcel, $sFilePath [, $bReadOnly = False [, $bVisible = True [, $sPassword = Default [, $sWritePassword = Default [, $bUpdateLinks = Default]]]]] )
                $oExcel          Excel Anwendungs-Objekt, mit dem das neue Arbeitsbuch geöffnet werden soll
                $sFilePath       Pfad oder Dateiname der Datei die geöffnet werden soll
                $bReadOnly       [optional] True öffnet das Arbeitsbuch als read-only (nur lesen) (Standard = False)
                $bVisible        [optional] True legt fest, ob das Arbeitsbuch-Fenster sichtbar sein wird (Standard = True)
                $sPassword       [optional] Passwort um das Arbeitsbuch zu lesen (falls es vergeben wurde) (standardmäßig keines)
                $sWritePassword  [optional] Passwort um das Arbeitsbuch zu schreiben (falls es vergeben wurde) (standardmäßig keines)
                $bUpdateLinks    [optional] Legt die Art fest, wie externe Referenzen (Links) in der Datei aktualisiert werden (Standard = Schlüsselwort Default)
                                Mögliche Werte sind:
                                    Default: Excel fragt den Nutzer um zu entscheiden, wie Links aktualisiert werden sollen
                                    0: Excel öffnet keine Aktualisierungs-Links
                                    3: Excel aktualisiert alle Links
        
        _Excel_Close ( $oExcel [, $bSaveChanges = True [, $bForceClose = False]] )
                $oExcel          Excel application object as returned by _Excel_Open()
                $bSaveChanges    [optional] Specifies whether changed worksheets should be saved before closing (default = True)
                $bForceClose     [optional] If True the Excel application is closed even when it was not started by _Excel_Open() (default = False)
    #ce
    
    ; Create application object or connect to an already running Excel instance
    $oExcel = _Excel_Open(False) ; $bVisible = False
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Open", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    
    OnAutoItExitRegister('_Exit')
    
    _OpenWorkbook($oWorkbook, $sWorkbook)
    
    AdlibRegister('_Adlib_OpenWorkbook', 35000)
    
    While True
        ; Do something...
    WEnd
    
    Func _Adlib_OpenWorkbook()
        ConsoleWrite('@@ (28) :(' & @MIN & ':' & @SEC & ') _Adlib_OpenWorkbook()' & @CR) ;### Function Trace
        If IsObj($oWorkbook) Then _CloseWorkbook($oWorkbook, $sWorkbook)
        _OpenWorkbook($oWorkbook, $sWorkbook)
    EndFunc   ;==>_Adlib_OpenWorkbook
    
    ; Open an existing workbook and return its object identifier.
    Func _OpenWorkbook(ByRef $oWorkbook, $sWorkbook)
        ConsoleWrite('@@ (48) :(' & @MIN & ':' & @SEC & ') _OpenWorkbook()' & @CR) ;### Function Trace
        $oWorkbook = _Excel_BookOpen($oExcel, $sWorkbook)
        _Excel_BookOpen($oExcel, $sWorkbook, False, True, Default, Default, 3)
        If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookOpen", "Error opening '" & $sWorkbook & "'." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    EndFunc   ;==>_OpenWorkbook
    
    ; Closes the specified workbook
    Func _CloseWorkbook(ByRef $oWorkbook, $sWorkbook)
        ConsoleWrite('@@ (56) :(' & @MIN & ':' & @SEC & ') _CloseWorkbook()' & @CR) ;### Function Trace
        ; _Excel_BookClose ( $oWorkbook [, $bSave = True] )
        $oWorkbook = _Excel_BookClose($oWorkbook) ; Arbeitsmappe speichern und schließen
        If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookClose", "Error saving workbook '" & $sWorkbook & "'." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    EndFunc   ;==>_CloseWorkbook
    
    ; Close the Excel instance opened by _Excel_Open
    Func _Exit()
        ConsoleWrite('@@ (69) :(' & @MIN & ':' & @SEC & ') _Exit()' & @CR) ;### Function Trace
        If IsObj($oExcel) Then
            _Excel_Close($oExcel, True, True) ; $bSaveChanges = True, $bForceClose = True
            If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_Close", "Error closing the Excel application." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
        EndIf
    EndFunc   ;==>_Exit
    Alles anzeigen
  • [Nim] nimble Update

    • Bitnugger
    • 10. September 2020 um 20:53

    Um dem Fehler auf die Spur zu kommen, habe ich Nim und alles was dazugehört auf einem anderen PC installiert. Doch damit habe ich noch mehr Probleme... das nun aktuelle VSCodium (v1.48.2) findet im Repo die Hälfte der auf dem anderen PC installierten Erweiterungen nicht mehr, so fehlt z.B. die unverzichtbare Erweiterung für Nim, und auch das Sprachpaket, um VSCodium auf German umzustellen.

    BugFix / Oscar - habt ihr keine Idee, woran das liegen könnte? Macht mich echt kirre, dass ich Nim nicht bzw. nicht mehr richtig ans Laufen bekomme.

  • Excel+dazugehörige Fehlermeldungen schließen

    • Bitnugger
    • 10. September 2020 um 19:49
    Zitat von presenter-test

    Leider schafft es Autoit dann nicht mehr Excel mit deren Meldugen zu schließen.

    AutoIt schafft das ganz sicher... allerdings nur dann, wenn dein Script entsprechend geschrieben wurde, was aber wohl nicht der Fall ist.

    Um dir ohne vorhergehende Ratespiele helfen zu können, solltest du dein bisheriges Script hier posten. Sensible Stellen kannst du darin ja ausixen...

  • JPG in Exe integrieren

    • Bitnugger
    • 10. September 2020 um 19:34

    Das kannst du sehr einfach mit diesem super Tool von UEZ machen: File to Base64 String Code Generator v1.20 Build 2020-06-05

  • _Singleton Fensterhandle

    • Bitnugger
    • 10. September 2020 um 06:29
    Zitat von Banana_2_Day

    Wird das unveränderte Skript erneut aufgerufen, wäre der neu berechnete Hash identisch mit der vorher gestarteten Instanz - richtig?

    Richtig, gleicher Dateiinhalt = gleicher Hash. Ändert sich der Dateiinhalt (und somit auch der Hash), kann eine zuvor gestartete Version aber nicht mehr erkannt werden. Ich denke, den Hash des Dateiinhalts zu verwenden, hat nur dann einen Mehrwert, wenn unterschiedliche Versionen/Varianten des Scripts bei deiner Entscheidung berücksichtigt werden sollen. Falls nicht, ist es wohl sinnvoller, einen Hash von @ScriptFullPath oder @ScriptName mit _WinAPI_ComputeCrc32, _WinAPI_HashString oder _Crypt_HashData zu erzeugen.

    Im Anhang findest du zwei kleine Demos... mit verschiedenen Hash-Funktionen... inkl. einer erweiterten WinGetHandle-Funktion (REGEXPTITLE, CLASS, INSTANCE).

    Dateien

    Example1.au3 8,44 kB – 463 Downloads Example2.au3 9,29 kB – 434 Downloads
  • _Singleton Fensterhandle

    • Bitnugger
    • 9. September 2020 um 03:29
    Zitat von Banana_2_Day

    Wie kann man Mutex Objekt am einfachsten erklären?

    Ich finde bei Wikipedia ist es gut erklärt...

    Der Begriff wechselseitiger Ausschluss bzw. Mutex (Abk. für englisch mutual exclusion) bezeichnet eine Gruppe von Verfahren, mit denen das Problem des kritischen Abschnitts gelöst wird. Mutex-Verfahren verhindern, dass nebenläufige Prozesse bzw. Threads gleichzeitig oder zeitlich verschränkt gemeinsam genutzte Datenstrukturen unkoordiniert verändern, wodurch die Datenstrukturen in einen inkonsistenten Zustand geraten können, auch wenn die Aktionen jedes einzelnen Prozesses oder Threads für sich betrachtet konsistenzerhaltend sind. ...

    In der Funktion _Singleton wird so ein Mutex erzeugt... der enthält u.a. den OccurrenceName und eine DACL (discretionary access control list).

    https://docs.microsoft.com/en-us/windows/…ydescriptordacl

    https://docs.microsoft.com/en-us/windows/…pi-createmutexw

    Ist uns aber eigentlich egal, was in dem Mutex ist... wichtig ist nur, dass wir wissen, wenn der Mutex bereits vorhanden ist und versucht wird, einen zweiten zu erstellen, die Funktion _Singleton dann 0 (False) und den Fehler $ERROR_ALREADY_EXISTS (183) zurückgibt.

    Zitat von Banana_2_Day

    Was haltet Ihr von folgendem Ansatz und wie kann man den verbessern?

    Keine gute Idee... denn dann darf das Script nicht mehr bearbeitet werden, da sich sonst ja auch der Hash ändert und somit nicht mehr gefunden wird.

    Dann besser einmalig eine GUID (_WinAPI_CreateGUID) erzeugen... davon kann dann ein Hash (weil kürzer) erzeugt werden... der dann als fixer Bestandteil des Fenstertitels verwendet wird. Oder schaue dir mal die Funktion _WinAPI_HashString an.

    Doch wozu der ganze Aufwand, wenn es auch ohne geht?

    Ich kenne viele Programme, bei denen sich der Titel ständig ändert... alle haben eines gemeinsam... ein Teil des Titels bleibt immer gleich - so handhabe ich das auch in meinen Scripten. Um das Handle nicht nur anhand eines Teils des Titels zu bestimmen, prüfe ich auch den ClassName (_WinAPI_GetClassName) des Fensters.

    Total Commander Ultima Prime 7.3 :: CPU: 022% (3,2 GHz) :: RAM: 078% (6,0 GB) :: C: 50% :: 09.09.2020 - 02:46:22 :: 03:07:43 ::

    F:\Eigene Dateien\TxT\ToDo.txt - Notepad++

    C:\Program Files (x86)\AutoIt3\Include\Misc.au3 - SciTE [20 von 20]

  • _Singleton Fensterhandle

    • Bitnugger
    • 8. September 2020 um 05:46
    Zitat von Banana_2_Day

    Wenn mit der Funktion _Singleton der zuerst gestartete Prozess erkannt wird

    Es wird nicht direkt ein Prozess erkannt, sondern das von diesem erzeugte Mutex Objekt... und ich wüsste jetzt nicht, wie man damit an das Handle des Fensters kommt.

    Doch mit einem versteckten Label ist das kein Problem - so würde ich es machen:

    AutoIt
    ;-- TIME_STAMP   2020-09-08 05:39:44   v 0.1
    
    Opt('MustDeclareVars', 1)
    
    #include <MsgBoxConstants.au3>
    #include <GUIConstants.au3>
    #include <Misc.au3>
    #include <WinAPISysWin.au3>
    
    Global $hGUI, $idSingleton, $sSingleton = 'Singleton_' & StringRegExpReplace(@ScriptName, '(.+)\..*', '\1')
    
    If _Singleton($sSingleton, 1) = 0 Then
        Local $aWinList = WinList('[CLASS:AutoIt v3 GUI]'), $hParent, $hSingleton, $hEdit, $aChildWindows, $sText
        For $i = 1 To $aWinList[0][0] Step 1
            $aChildWindows = _WinAPI_EnumChildWindows($aWinList[$i][1])
            If Not @error Then
                For $j = 1 To $aChildWindows[0][0] Step 1
                    If ControlGetText($aChildWindows[$j][0], '', '') = $sSingleton Then
                        $hParent = $aWinList[$i][1]        ; $hGUI
                        $hSingleton = $aChildWindows[$j][0] ; $idSingleton
                        $hEdit = $aChildWindows[$j + 1][0] ; $idEdit
                        $sText = ControlGetText($hEdit, '', '') & @CRLF
                        $sText &= "Dies ist die zweite Instanz des Skripts." & @CRLF
                        $sText &= "$hParent    --> " & $hParent & @CRLF
                        $sText &= "$hSingleton --> " & $hSingleton & @CRLF
                        ControlSetText($hEdit, '', '', $sText)
                        WinActivate($hParent)
                        Exit
                    EndIf
                Next
            EndIf
        Next
        MsgBox($MB_SYSTEMMODAL, "Fehler", "$hSingleton nicht gefunden.")
        Exit
    Else
        $hGUI = GUICreate('Test', 600, 320)
        Local $aClientSize = WinGetClientSize($hGUI)
        Local $bShowLabel = False ; True
        If $bShowLabel Then ; Label ist sichbar!
            $idSingleton = GUICtrlCreateLabel($sSingleton, 2, 2, $aClientSize[0] - 4, 20, BitOR($GUI_SS_DEFAULT_LABEL, $SS_SUNKEN))
            GUICtrlSetFont(-1, 11, 800, 0, 'Courier New')
            GUICtrlSetColor(-1, 0xFF0000)
        Else ; Label ist nicht sichbar!
            $idSingleton = GUICtrlCreateLabel($sSingleton, -1, -1, 0, 0)
        EndIf
    
        Local $sMemo = "Dies ist die erste Instanz des Skripts." & @CRLF & '$hGUI       --> ' & $hGUI & @CRLF & '$sSingleton --> ' & $sSingleton & @CRLF & @CRLF & 'Dieses Fenster wird in 3s minimiert, dann Script erneut starten.' & @CRLF
        Local $idEdit = GUICtrlCreateEdit($sMemo, 0, $bShowLabel ? 25 : 0, $aClientSize[0], $aClientSize[1] - ($bShowLabel ? 25 : 0))
        GUICtrlSetFont(-1, 11, 800, 0, 'Courier New')
        GUISetState()
        Sleep(3000)
        GUISetState( @SW_MINIMIZE, $hGUI)
    
        While True
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    Exit
            EndSwitch
        WEnd
    EndIf
    Alles anzeigen
  • [Nim] nimble Update

    • Bitnugger
    • 6. September 2020 um 20:57

    Leider kennt nimble (noch) kein Command, mit dem man ein Update der bereits installierten Pakete machen kann, sondern diese lediglich erneut installieren, bzw. mit einer neueren Version überschreiben kann.

    Update kennt nimble leider nicht:

    nimble Update pkgname

    Nur Install:

    nimble Install pkgname ; shows interactive prompts (y/n)

    nimble Install pkgname -y ; Accept all interactive prompts (Overwrite existing packages).

    nimble Install pkgname -n ; Reject all interactive prompts (Skip existing packages).

    Hier habe ich dann ein Script gefunden, mit dem alle installierten Pakete in einem Rutsch mit der jeweils aktuellen Version überschrieben werden können.

    https://forum.nim-lang.org/t/4648

    Auf dieser Seite verweist der Author jedoch auf github, wo er eine aktuellere Version anbietet:

    https://gist.github.com/zaferarican/91fe52dcf3f9aa78c24d86168d8aa5fb

    Diese Version habe ich dann ein wenig erweitert und auch einen kleinen Fehler abgefangen. ; ==>> if package == "": continue

    Als Default wird bei ihm die Option -y gesetzt:

    let (outP, errP) = gorgeEx("nimble -y install " & package)

    Das habe ich nun so umgeschrieben, dass auch -n als Option angegeben werden kann, oder keine, dann wird -y verwendet.

    update_all.nims
    Code
    #[ Run it using
       nim e update_all.nims [-y|-n] # ! -y = Default
      # * -y - Accept all interactive prompts (Overwrite existing packages).
      # * -n - Reject all interactive prompts (Skip existing packages).
    ]#
    
    import strutils
    
    proc execErr(cmd: string, exitMsg: string= "", exitCode: int = 1): string =
      let (outR, errR) = gorgeEx(cmd)
      if errR != 0:
        echo outR
        echo exitMsg
        quit(exitCode)
      result = outR
    
    var option: string = "-y"
    if paramCount() > 0:
      for p in 1..paramCount():
        var param = paramStr(p)
        # echo "param = " & param
        if param == "-n": option = param
    
    discard execErr("nimble refresh", exitCode = 2)
    
    let installed = execErr("nimble list --installed", exitCode = 1)
    
    echo "\nInstalled packages:\n" & installed & "\n"
    
    # if 1 == 1: quit(2)
    
    let out_lines = splitLines(installed)
    for line in out_lines:
      let package = line.split({' '})[0]
      if package == "": continue
      echo "Updating " & package
    
      let (outP, errP) = gorgeEx("nimble install " & package & " " & option)
      echo outP
      if errP != 0:
         echo "Error!\n"
      else:
         echo "Done\n"
    Alles anzeigen

    Durch die Option -n passiert aber noch mehr, als "Reject all interactive prompts (Skip existing packages).", denn nun sieht meine Liste der installierten Pakete so aus und hat evtl. auch Probleme verursacht, denn das Nim-Example von Oscar zu GetBkColor funktioniert bei mir nicht. Andere Scripte hingegen schon... z.B. BassTest.nim, WinList.nim.

    Liste der installierten Pakete anzeigen:

    C:\Users\ghost>nimble list -i

    c2nim [0.9.14]

    cligen [1.2.0]

    miniz [0.1.0]

    nimbass [0.1.3, 0.2.0]

    nimble [#head, 0.11.4]

    nimgen [#head, 0.5.1]

    nimterop [#head, 0.6.11]

    regex [0.14.1, 0.16.2]

    segmentation [0.1.0]

    unicodedb [0.9.0]

    unicodeplus [0.6.0, 0.8.0]

    winim [3.3.3, 3.4.0]

    wnim [0.11.0, 0.11.2, 0.11.3]

    c:\Users\Ghost\.nimble\pkgs\

    c2nim-0.9.14\

    cligen-1.2.0\

    miniz-0.1.0\

    nimbass-0.1.3\

    nimbass-0.2.0\

    nimble-#head\

    nimble-0.11.4\

    nimgen-#head\

    nimgen-0.5.1\

    nimterop-#head\

    nimterop-0.6.11\

    regex-0.14.1\

    regex-0.16.2\

    segmentation-0.1.0\

    unicodedb-0.9.0\

    unicodeplus-0.6.0\

    unicodeplus-0.8.0\

    winim-3.3.3\

    winim-3.4.0\

    wnim-0.11.0\

    wnim-0.11.2\

    wnim-0.11.3\

    Fehler bei GetBkColor.nim:

    C:\Users\ghost\NIM\@Oscar>nim c -r "c:\Users\ghost\NIM\@Oscar\GetBkColor.nim"

    Hint: used config file 'C:\Users\ghost\scoop\apps\nim\current\config\nim.cfg' [Conf]

    C:\Users\ghost\.nimble\pkgs\winim-3.4.0\winim\inc\winsock.nim(1624, 83) Error: undeclared identifier: 'equalMem'

    Tja... wo drückt hier der Schuh und wie biege ich es hin, dass es (wieder) funktioniert?

    Sollte ich die älteren Version evtl. löschen, oder besser doch behalten? Habt ihr auch mehrere Versionen installiert?

    __

    C:\Users\ghost>nim -V

    Nim Compiler Version 1.2.6 [Windows: amd64]

    Compiled at 2020-07-29

    Copyright (c) 2006-2020 by Andreas Rumpf

    git hash: bf320ed172f74f60fd274338e82bdc9ce3520dd9

    active boot switches: -d:release

    Dateien

    nim.cfg.zip 3,1 kB – 589 Downloads
  • Hintergrundfarbe für Controls ermitteln OHNE GetPixel

    • Bitnugger
    • 4. September 2020 um 23:37
    Zitat von Professor Bernd

    Das ist jedoch nicht verwunderlich, denn es scheint schon daran zu scheitern, dass kein Handle für das Scintilla Control ermittelt werden kann.

    Zitat von Professor Bernd

    Local $hCtrl = ControlGetHandle('', '', '[CLASS:Scintilla; INSTANCE:1]')

    Seltsamerweise funktioniert es so anscheinend nicht zuverlässig... und ich denke, ich habe den Grund dafür gefunden:

    Wird ein leerer String für den ersten Parameter (title) übergeben, wird das Handle des aktiven Fensters verwendet!

    So ist es besser:

    AutoIt
    Local $hCtrl = ControlGetHandle(WinGetHandle('[CLASS:SciTEWindow]'), '', '[CLASS:Scintilla; INSTANCE:1]')
    Zitat von Professor Bernd

    Die Fragen zu SendMessage und dem Freigeben des Brush-Objekts sind geklärt

    Ja... und soweit ich das jetzt verstehe, wird die Message von der Default-WinProc verarbeitet.

  • Hintergrundfarbe für Controls ermitteln OHNE GetPixel

    • Bitnugger
    • 2. September 2020 um 20:35
    Zitat von Professor Bernd

    _SendMessage(_WinAPI_GetParent($hWnd), $WM_CTLCOLORSTATIC, $hDC, $hWnd)

    Hm, diese Zeile macht meinem Verständnis nach keinen Sinn:

    • weil die Message (vom Parent-Window) nicht ausgewertet wird
    • weil die Zeile keinen Einfluss auf den Rückgabewert der Funktion GUICtrlGetBkColor_WinAPI_2 hat

    Zudem funktioniert $WM_CTLCOLORSTATIC nur bei selbst erstellten statischen Controls.

    Damit bekomme ich als Ergebnis 0xFFFFFF... ist bei mir aber 0xADC2DE.

    ConsoleWrite('! $iColor = 0x' & Hex(GUICtrlGetBkColor_WinAPI_2(ControlGetHandle('', '', '[CLASS:Scintilla; INSTANCE:1]')), 6) & @CRLF)

    #include <WindowsConstants.au3>

    $WM_CTLCOLOR = 0x0019

    $WM_CTLCOLORMSGBOX = 0x0132

    $WM_CTLCOLOREDIT = 0x0133

    $WM_CTLCOLORLISTBOX = 0x0134

    $WM_CTLCOLORBTN = 0x0135

    $WM_CTLCOLORDLG = 0x0136

    $WM_CTLCOLORSCROLLBAR = 0x0137

    $WM_CTLCOLORSTATIC = 0x0138

  • Noch eine MouseHover-UDF

    • Bitnugger
    • 1. September 2020 um 14:48

    Sehr schön! :thumbup:

  • Diskussion zu [Skripte] control hover effekt ohne fehler

    • Bitnugger
    • 31. August 2020 um 18:34
    Zitat von Professor Bernd

    Warum sagst du das?

    Durch deinen Post #6 hast du einen 12 Jahre alten Thread ausgegraben und somit gleichzeitig auch den Grundstein für evtl. darauf folgende Diskussionen zu deinem Post gelegt.

    Ich steige an dieser Stelle aber nun aus...

  • Diskussion zu [Skripte] control hover effekt ohne fehler

    • Bitnugger
    • 31. August 2020 um 17:22
    Zitat von Professor Bernd

    Ich finde es schade, dass der Thread gekapert wurde, um CallBacks zu diskutieren.

    Nun ja, da bist du aber nicht ganz unschuldig dran... denn anstelle einen 12 Jahre alten Thread auszugraben, hättest du besser einen eigenen erstellt, in dem du auf diesen hier verweist.

    Ob via Hauptschleife oder Timer... beides ist Polling, das möglichst vermieden werden sollte.

  • Fehler in der deutschen Hilfe bitte hier melden (Hilfedatei 3.3.14.5 2020.04.13)

    • Bitnugger
    • 30. August 2020 um 19:58
    Zitat von Professor Bernd

    Kann man das irgendwo umstellen, dass die Suche grundsätzlich wie mit Wildcards sucht?

    Nein.

    Zitat von Professor Bernd

    Oder hat das mit Windows zu tun? Dort scheint die Suche ähnlich "komisch" zu funktionieren.

    Nein, wohl mehr mit dem IE. Was ist daran komisch? Wenn du ein Teilbegriff mit einem Wildcard für die Suche eingibst, dann muss dieser entweder am Anfang oder am Ende übereinstimmen, um als Match angezeigt zu werden.

  • Fehler in der deutschen Hilfe bitte hier melden (Hilfedatei 3.3.14.5 2020.04.13)

    • Bitnugger
    • 30. August 2020 um 19:29
    Zitat von Professor Bernd

    Wie groß ist denn der Aufwand, die Suche in der Offline-Hilfe (AutoIt.chm) zu aktualisieren/erweitern, sodass mehr Begriffe gefunden werden. Zum Beispiel:


    WindowFromPoint => findet _WinAPI_WindowFromPoint, aber nicht _WinAPI_ChildWindowFromPointEx

    So kanst du mit Wildcards suchen...

    *FromPoint*
    *GetPos*

    *API*Pos*

    *Info

  • Diskussion zu [Skripte] control hover effekt ohne fehler

    • Bitnugger
    • 30. August 2020 um 14:52
    Zitat von Professor Bernd

    Wenn man Label 2 beim Erstellen (Zeile 27) eine andere Farbe gibt, wird sie nach dem Hovern auf die Hover-NormalColor gesetzt. Label 2 sollte jedoch unverändert bleiben.

    Stimmt... so aber nicht mehr...

    AutoIt
    ;-- TIME_STAMP   2020-08-30 14:42:37   v 0.1
    
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <StructureConstants.au3>
    #include <WinAPIConstants.au3>
    #include <WinAPIConv.au3>
    #include <WinAPIInternals.au3>
    #include <WinAPISys.au3>
    #include <WinAPISysWin.au3>
    #include <WindowsConstants.au3>
    
    Opt("MustDeclareVars", 1)
    OnAutoItExitRegister('OnAutoItExit')
    
    ;~ Global Const $tagMSLLHOOKSTRUCT = $tagPOINT & ';dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo'
    
    Global $__hMouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam")
    Global $__hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($__hMouseProc), _WinAPI_GetModuleHandle(0))
    
    Global Const $COLOR_HOOVER = 0xD7EDFF ; helles grau
    Global Const $COLOR_NORMAL = 0xE6E6E6 ; helles blau
    
    Global $Form1 = GUICreate("Form1", 514, 330)
    Global $Label1 = GUICtrlCreateLabel("Label1", 96, 88, 92, 33, BitOR($SS_CENTER, $SS_CENTERIMAGE, $WS_BORDER))
    GUICtrlSetBkColor(-1, $COLOR_NORMAL)
    Global $Label2 = GUICtrlCreateLabel("Label2", 208, 88, 92, 33, BitOR($SS_CENTER, $SS_CENTERIMAGE, $WS_BORDER))
    ;~ GUICtrlSetBkColor(-1, $COLOR_NORMAL)
    GUICtrlSetBkColor(-1, 0xFFFF00) ; <== gelb
    Global $Label3 = GUICtrlCreateLabel("Label3", 320, 88, 92, 33, BitOR($SS_CENTER, $SS_CENTERIMAGE, $WS_BORDER))
    GUICtrlSetBkColor(-1, $COLOR_NORMAL)
    
    Global $aHoverCtrl[0] ; Array mit den Handles der Hover-Ctrls
    _ArrayAdd($aHoverCtrl, GUICtrlGetHandle($Label1)) ; Hover-Effekt nur bei Label1
    _ArrayAdd($aHoverCtrl, GUICtrlGetHandle($Label3)) ; und Label3
    GUISetState(@SW_SHOW)
    
    
    While 1
        Local $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                ExitLoop
        EndSwitch
    WEnd
    
    Func OnAutoItExit()
        _WinAPI_UnhookWindowsHookEx($__hHook)
        DllCallbackFree($__hMouseProc)
    EndFunc   ;==>OnAutoItExit
    
    Func _MouseProc($_nCode, $_wParam, $_lParam)
        Local Static $hLast
    
        If $_nCode > -1 Then
            Switch $_wParam
                Case $WM_MOUSEMOVE
                    Local $tPoint = DllStructCreate($tagPOINT, $_lParam)
                    Local $hRoot = _WinAPI_GetAncestor(_WinAPI_WindowFromPoint($tPoint), $GA_ROOT)
                    _WinAPI_ScreenToClient($hRoot, $tPoint)
                    Local $hChild = _WinAPI_ChildWindowFromPointEx($hRoot, $tPoint)
                    If IsHWnd($hChild) And $hChild <> $hLast Then
                        If $hLast <> $hRoot And _ArraySearch($aHoverCtrl, $hLast) > -1 Then GUICtrlSetBkColor(_WinAPI_GetDlgCtrlID($hLast), $COLOR_NORMAL)
                        If $hChild <> $hRoot And _ArraySearch($aHoverCtrl, $hChild) > -1 Then GUICtrlSetBkColor(_WinAPI_GetDlgCtrlID($hChild), $COLOR_HOOVER)
                        $hLast = $hChild
                    EndIf
            EndSwitch
        EndIf
    
        Return _WinAPI_CallNextHookEx($__hHook, $_nCode, $_wParam, $_lParam)
    EndFunc   ;==>_MouseProc
    Alles anzeigen
  • Diskussion zu [Skripte] control hover effekt ohne fehler

    • Bitnugger
    • 29. August 2020 um 19:23
    Zitat von BugFix

    Falls die Frage kommt, warum ich nicht WM_MOUSEMOVE mit GUIRegisterMessage verwendet habe: WM_MOUSEMOVE sendet seine Nachrichten nicht an das Parent. D.h., wenn ich über einem Ctrl bin und habe die Nachricht für das Fenster registriert, bekommt dieses davon nichts mit.

    Wobei es hier auch eine "Besonderheit" gibt:

    WM_MOUSEMOVE message

    Posted to a window when the cursor moves. If the mouse is not captured, the message is posted to the window that contains the cursor. Otherwise, the message is posted to the window that has captured the mouse.

    https://docs.microsoft.com/en-us/windows/…ev/wm-mousemove

    SetCapture function ==>> _WinAPI_SetCapture ( $hWnd )

    Sets the mouse capture to the specified window belonging to the current thread. SetCapture captures mouse input either when the mouse is over the capturing window, or when the mouse button was pressed while the mouse was over the capturing window and the button is still down. Only one window at a time can capture the mouse. If the mouse cursor is over a window created by another thread, the system will direct mouse input to the specified window only if a mouse button is down.

    https://docs.microsoft.com/en-us/windows/…user-setcapture

    Related

    https://docs.microsoft.com/en-us/windows/…user-getcapture

    https://docs.microsoft.com/en-us/windows/…-releasecapture

    Ginge das nicht auch hiermit?

    TrackMouseEvent function ==>> _WinAPI_TrackMouseEvent ( $hWnd, $iFlags [, $iTime = -1] )

    Posts messages when the mouse pointer leaves a window or hovers over a window for a specified amount of time.

    https://docs.microsoft.com/en-us/windows/…trackmouseevent

  • Globale Variable ändern

    • Bitnugger
    • 28. August 2020 um 14:10

    Ich habe mir das so gemerkt:

    Funktionsparameter haben immer einen lokalen Scope und existieren somit nur innerhalb der Funktion, wenn das Schlüsselwort ByRef nicht angegeben wird.

    Remarks

    The ByRef keyword indicates that the parameter should be treated as a reference to the original. By default the parameter is copied into a new variable but ByRef links the new variable to the original.

    Das Schlüsselwort ByRef gibt an, dass der Parameter als Referenz auf das Original behandelt werden soll. Standardmäßig wird der Parameter in eine neue Variable kopiert, aber ByRef verknüpft die neue Variable mit dem Original.

    AutoIt
    Global $test = "alt"
    
    _test_($test)
    ConsoleWrite(@ScriptLineNumber & @TAB & $test & @CRLF) ; $test = "neu"
    
    Func _test_(ByRef $test)
        $test = "neu"
    EndFunc   ;==>_test_
  • Wie kann man eine Variablen-Liste an Switch-Case übergeben?

    • Bitnugger
    • 27. August 2020 um 17:35
    Zitat von water

    Wobei anzumerken ist, dass der Kopiervorgang nur dann durchgeführt wird, wenn der Array in der Funktion geändert wird. D.h. ein reiner Lesezugriff auf den Array kopiert den Array nicht.

    Ja, stimmt, aber...

    Entire arrays can be passed to functions (and returned from them) by simply using the array name without any brackets. Arrays should be passed to user-defined functions using the ByRef keyword to avoid the overhead of copying all the data in the array. Note that AutoIt only copies an array parameter if the contents are changed, so it is only in this case that ByRef offers an advantage, although it is recommended that to use it in all cases.

    Ganze Arrays können an Funktionen übergeben (und von diesen zurückgegeben) werden, indem einfach der Array-Name ohne Klammern verwendet wird. Arrays sollten mit dem Schlüsselwort ByRef an benutzerdefinierte Funktionen übergeben werden, um den Aufwand für das Kopieren aller Daten im Array zu vermeiden. Beachten Sie, dass AutoIt einen Array-Parameter nur kopiert, wenn der Inhalt geändert wird. Daher bietet ByRef nur in diesem Fall einen Vorteil, obwohl empfohlen wird, ihn in allen Fällen zu verwenden.

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™