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

  • mehrere Zeiten wenn abgelaufen für OBS

    • BugFix
    • 13. Juli 2022 um 13:25
    Zitat von WhiteHorse

    önntest du mir ggf mal bitte ein beispiel machen

    Ich habe deinen Code mal als Basis genommen, einiges - aber nicht alles - optimiert, aber das Unnütze noch nicht raus geworfen, kannst du dann selbst bereinigen.

    Ich gehe davon aus, da du "Stunden|Minuten|Sekunden" erfasst, dass das keine Uhrzeit, sondern die Dauer der Aufnahme ist. Btw: Wozu Hotkey? Du hast doch einen Start/Stop - Button. Hotkeys sind Global und du kommst oft in Konflikt mit dem System (F7 ist z.B. bei mir nicht möglich). Verwende besser GuiSetAccelerators.

    Schau es dir an:

    AutoIt
    ;-- TIME_STAMP   2022-07-13 13:21:48
    
    #include <GUIConstantsEx.au3>
    
    Global $end, $end2, $timer, $timer2, $running = False, $running2 = False
    ;~ Global $input[3], $input2[3], $input3[3], $input4[3], $input5[3]
    Global $aInput[5][3]
    Global $name[3]=['Stunden','Minuten','Sekunden'], $name2[3]=['','',''], $name3[3]=['','','']
    Global $name4[3]=['','',''], $name5[3]=['','',''], $button[2]=['Start','Stop']
    
    Global Const $sWinOBS = "OBS 26.1.1 (64-bit, windows) - Profil: Unbenannt - Szenen: Unbenannt"
    Global $bIdle = True    ; True = Leerlauf, keine Aufnahme läuft
    Global $TimerStart      ; wird gesetzt wenn eine Aufnahme beginnt
    Global $aRecTimes[5]    ; die eingetragenen Aufnahmezeiten in Sekunden
    Global $aCheckbox[4]    ; Array mit Checkbox-ID
    Global $iCurrRec = -1   ; Index der aktuellen Aufnahme, bei Programmstart: keiner
    
    Global $hGui = GUICreate('5 Aufnahme-Timer', 800, 700, Default, Default, 0x10C80000)
    
    For $i=0 To 2
        GUICtrlCreateGroup($name[$i], 5+70*$i, 5, 70, 40)
        GUICtrlCreateGroup($name2[$i], 5+70*$i, 35, 70, 40)
        GUICtrlCreateGroup($name3[$i], 5+70*$i, 65, 70, 40)
        GUICtrlCreateGroup($name4[$i], 5+70*$i, 95, 70, 40)
        GUICtrlCreateGroup($name5[$i], 5+70*$i, 125, 70, 40)
        For $j = 0 To 4
            $aInput[$j][$i] = GUICtrlCreateInput('', 10+70*$i, 20+30*$j, 60, 20, 1)
        Next
    ;~     $input[$i] = GUICtrlCreateInput('', 10+70*$i, 20, 60, 20, 1)
    ;~     $input2[$i] = GUICtrlCreateInput('', 10+70*$i, 50, 60, 20, 1)
    ;~     $input3[$i] = GUICtrlCreateInput('', 10+70*$i, 80, 60, 20, 1)
    ;~     $input4[$i] = GUICtrlCreateInput('', 10+70*$i, 110, 60, 20, 1)
    ;~     $input5[$i] = GUICtrlCreateInput('', 10+70*$i, 140, 60, 20, 1)
    Next
    
    $go = GUICtrlCreateButton('Start', 550, 650, 210, 20)
    $Herunterfahren = GUICtrlCreateCheckbox("Computer herunterfahren", 600, 600, 201, 25)
    For $i = 0 To 3
        $aCheckbox[$i] = GUICtrlCreateCheckbox("Aufnahme " & $i+2 & " Aktivieren", 220, 47+$i*30, 201, 25)
    Next
    ;~ $Input2 = GUICtrlCreateCheckbox("Aufnahme 2 Aktivieren", 220, 47, 201, 25)
    ;~ $Input3 = GUICtrlCreateCheckbox("Aufnahme 3 Aktivieren", 220, 77, 201, 25)
    ;~ $Input4 = GUICtrlCreateCheckbox("Aufnahme 4 Aktivieren", 220, 107, 201, 25)
    ;~ $Input5 = GUICtrlCreateCheckbox("Aufnahme 5 Aktivieren", 220, 137, 201, 25)
    $Close = GUICtrlCreateButton("Schließen", 550, 550, 83, 25)
    $Label2 = GUICtrlCreateLabel("Programm Start mit Hotkey F7", 500, 500, 170, 24)
    GUICtrlSetFont(-1, 6, 800, 0, "MS Sans Serif")
    
    GUISetState()
    
    ; MainLoop
    While True
        Switch GUIGetMsg()
            Case -3
                Exit
            Case $go
                If $bIdle Then
                    StartTimer()
                Else
                    StopTimer() ; zum Abbruch einer laufenden Aufnahme
                EndIf
        EndSwitch
        If Not $bIdle Then
            If _CheckTimer() Then StopTimer()
        EndIf
    WEnd
    
    Func _CalcRecordingSeconds()
        Local $inHr, $inMin, $inSec, $sumSec = 0
        For $i = 0 To 4
            $sumSec = 0
            If $i > 0 Then
                If BitAND(GUICtrlRead($aCheckbox[$i-1]), $GUI_UNCHECKED) Then ContinueLoop
            EndIf
            $inHr = GUICtrlRead($aInput[$i][0])
            $inMin = GUICtrlRead($aInput[$i][1])
            $inSec = GUICtrlRead($aInput[$i][2])
            If $inHr <> '' Then $sumSec += $inHr*60*60
            If $inMin <> '' Then $sumSec += $inMin*60
            If $inSec <> '' Then $sumSec += $inSec
            $aRecTimes[$i] = $sumSec
        Next
    EndFunc
    
    
    ;HotKey's
    ;~ HotKeySet ("{F7}", "StartTimer")    ; Soll das unabhängig aufgerufen werden können - auch wenn die GUI im Hintergrund ist?
                                        ; Wenn nicht: GUISetAccelerators() verwenden.
    
    HotKeySet ("{F7}", '_ToggleStartStop')
    
    Func _ToggleStartStop()
        Return ($bIdle ? StartTimer() : StopTimer())
    EndFunc
    
    Func StartTimer()
        If $iCurrRec = -1 Then  ; erstmaliger Aufruf
            _CalcRecordingSeconds()
        EndIf
        While $iCurrRec < UBound($aRecTimes) -1
            $iCurrRec += 1
            If $aRecTimes[$iCurrRec] <> 0 Then ExitLoop ; leere Einträge überspringen
        WEnd
        If $aRecTimes[$iCurrRec] = 0 Then Return MsgBox(16, 'FEHLER', 'Keine Aufnahmezeiten eingetragen!')
        GUICtrlSetData($go, 'Stop')
        MsgBox(64, 'Aufnahme', 'Starte Aufnahme #' & $iCurrRec+1)
        $TimerStart = TimerInit()
        $bIdle = False
        ; starte Aufnahme
        ControlSend($sWinOBS, "", "", "{F8}")
    EndFunc
    
    
    Func _CheckTimer()
        Return (Floor(TimerDiff($TimerStart)/1000) >= $aRecTimes[$iCurrRec])
    EndFunc
    
    
    Func StopTimer()
        If $iCurrRec = UBound($aRecTimes) -1 Then  ; letzte Aufnahme beendet
            If BitAND(GUICtrlRead($Herunterfahren), $GUI_CHECKED) Then
                Return MsgBox(64, 'Herunterfahren', 'Hier [#' & @ScriptLineNumber & '] Shutdown einfügen.')
            EndIf
        Else
            $bIdle = True
            ; beende Aufnahme
            ControlSend($sWinOBS, "", "", "{F8}")
            GUICtrlSetData($go, 'Start')
            MsgBox(64, 'Aufnahme', 'Stoppe Aufnahme #' & $iCurrRec+1)
        EndIf
    EndFunc
    
    
    
    #comments-start
    
    
    ;##############################
    ;Start mit der ersten Aufnahme#
    ;##############################
    
    ;Funktion das mit der Taste F7 gestartet wird
    
    Func StartTimer()
    HotKeySet ("{F7}")
    
    
    
                $running = Not $running
                GUICtrlSetData($go, $button[$running])
                $end = Convert($input)
                $timer=TimerInit()
    
                If $running And TimerDiff($timer)>=$end Then
                    $running = False
                    GUICtrlSetData($go, $button[$running])
                    Send ("{F8}")
                    ;;;;;
                    If _IsChecked($Input2) Then
                    Call ("ANAufnahem2")
                    Else
                    Call ("AUSAufnahem2")
                   EndIf
    
    
    
                 EndIf
    
    
    
    
    EndFunc
    
    
    
    
    ;Funktion mit Knöpfen (Knopf Start) ist hier mit enthalten und Schließen
    While 1
        Switch GUIGetMsg()
    
             Case $Close
                Exit
    
            Case -3
                Exit
            Case $go
                $running = Not $running
                GUICtrlSetData($go, $button[$running])
                $end = Convert($input)
                $timer=TimerInit()
            Case Else
            If $running And TimerDiff($timer)>=$end Then
                    $running = False
                    GUICtrlSetData($go, $button[$running])
                    ControlSend($sWinOBS, "", "", "{F8}")
                    Send ("{F8}")
                    ;;;;;
                    If _IsChecked($Input2) Then
                    Call ("ANAufnahem2")
                    Else
                    Call ("AUSAufnahem2")
                   EndIf
    
    
                 EndIf
    
    
    
      EndSwitch
    
     WEnd
    
    
    Func Convert($array)
        Return 1000*(60*(60*(GUICtrlRead($array[0]))+GUICtrlRead($array[1]))+GUICtrlRead($array[2]))
     EndFunc
    
     Func _IsChecked($Herunterfahren)
        Return BitAND(GUICtrlRead($Herunterfahren), $GUI_CHECKED) = $GUI_CHECKED
     EndFunc
    
    
    ;######################
    ;Aufnahme 1 endet hier#
    ;######################
    
    
    Func ANAufnahem2 ()
    
     Sleep (3000) ;Puffer um abzuspeichern
    
    
    
    While 2
        Switch GUIGetMsg()
    
    
             Case $Close
                Exit
    
            Case -3
                Exit
            Case $go
                $running2 = Not $running2
                GUICtrlSetData($go, $button [$running2])
                $end = Convert($input2)
                $timer2=TimerInit()
             Case Else
            If $running2 And TimerDiff($timer2)>=$end2 Then
               $running2 = False
                    GUICtrlSetData($go, $button[$running2])
                    ControlSend($sWinOBS, "", "", "{F8}")
                    Send ("{F8}")
                    ;;;;;
                    If _IsChecked($Input3) Then
                    Call ("AN")
                    Else
                    Call ("AUS")
                   MsgBox(0, 'Info', 'Tesssssssst 2 durch an?')
                   EndIf
    
    
                 EndIf
    
    
    EndSwitch
    WEnd
    
     EndFunc
    
    Func AUSAufnahem2 ()
       ControlSend($sWinOBS, "", "", "{F8}")
       Sleep (1000)
       MsgBox(0, 'Info', '2 durch AUS')
    EndFunc
    
    
    ;##################################################################################################
    ;Hier wird nochmal abgefragt und entschieden ob der Harken bei Herrunterfahren drin ist oder nicht#
    ;##################################################################################################
    
    Func AN()
       ControlSend($sWinOBS, "", "", "{F8}")
       Sleep (1000)
       MsgBox(0, 'Info', 'ANNNNNNNNNNNNNNNNNNNNNNNNNNN')
    ;   Shutdown(1)
    EndFunc
    
    Func AUS()
       ControlSend($sWinOBS, "", "", "{F8}")
       Sleep (1000)
       MsgBox(0, 'Info', 'Aufnahme gestoppt')
    EndFunc
    
    
    #comments-end
    Alles anzeigen
  • mehrere Zeiten wenn abgelaufen für OBS

    • BugFix
    • 13. Juli 2022 um 10:21
    Zitat von WhiteHorse

    das bringt mir nicht viel ich muss wissen wie ich die zweite schleife zum laufen bringen muss

    :?:

    Du brauchst doch nur eine einzige Schleife.

    - Mainloop läuft

    - Programmteil1 (Funktion!!) wird aufgerufen

    - Funktion setzt Check-Variable: 1: 'Bin-am-Arbeiten'

    - Wenn die Funktion fertig ist wird Inhalt auf 0: 'Fertig' gesetzt

    - In Schleife bei jedem Durchlauf prüfen: Inhalt der Check-Variable

    - Variable = 1 ? Funktion rennt noch - tue nichts

    - Variable = 0 ? Funktion ist fertig - auf zur nächsten

    usw. usf.

    Ggf. ist es sinnvoll den Check nicht im Mainloop auszuführen, sondern eine Prüffunktion mit AdlibRegister einzusetzen.

  • mehrere Zeiten wenn abgelaufen für OBS

    • BugFix
    • 12. Juli 2022 um 11:37

    Es gibt viele Möglichkeiten mit Timern zu arbeiten.

    Für parallele Abläufe kannst du z.B. folgendes simples Bsp. nutzen

    AutoIt
    Global $gTime1 = 5  ; Angabe in Sekunden
    Global $gTime2 = 10
    Global $gTime3 = 60
    
    
    Global $hGui = GUICreate('Test ' & StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC))
    Global $lbEvent1 = GUICtrlCreateLabel('', 20, 20, 200, 17)
    GUICtrlSetColor(-1, 0x000088)
    GUICtrlSetBkColor(-1, 0xE6E6FA)
    Global $lbEvent2 = GUICtrlCreateLabel('', 20, 45, 200, 17)
    GUICtrlSetColor(-1, 0x000088)
    GUICtrlSetBkColor(-1, 0xE6E6FA)
    Global $lbEvent3 = GUICtrlCreateLabel('', 20, 70, 200, 17)
    GUICtrlSetColor(-1, 0x000088)
    GUICtrlSetBkColor(-1, 0xE6E6FA)
    Global $dumTimer1 = GUICtrlCreateDummy()
    Global $dumTimer2 = GUICtrlCreateDummy()
    Global $dumTimer3 = GUICtrlCreateDummy()
    
    Global $gTimer0 = TimerInit()
    Global $gt1 = 0, $gt2 = 0, $gt3 = 0
    AdlibRegister(_FireDummy)
    
    GUISetState()
    
    While True
        Switch GUIGetMsg()
            Case -3
                Exit
            Case $dumTimer1
                GUICtrlSetData($lbEvent1, $gt1 & ' * ' & $gTime1 & ' Sec abgelaufen')
            Case $dumTimer2
                GUICtrlSetData($lbEvent2, $gt2 & ' * ' & $gTime2 & ' Sec abgelaufen')
            Case $dumTimer3
                GUICtrlSetData($lbEvent3, $gt3 & ' * ' & $gTime3 & ' Sec abgelaufen')
        EndSwitch
    WEnd
    
    Func _FireDummy()
        Local Static $bFire1 = False, $bFire2 = False, $bFire3 = False
        Local Static $clocksec = 0
        Local $TDiff = TimerDiff($gTimer0)
        If Floor($TDiff / 1000) > $clocksec Then
            $clocksec += 1
            WinSetTitle($hGui, '', 'Test ' & StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC))
        EndIf
        If Floor($TDiff / ($gTime1*1000)) > $gt1 Then
            $gt1 += 1
            $bFire1 = True
        EndIf
        If Floor($TDiff / ($gTime2*1000)) > $gt2 Then
            $gt2 += 1
            $bFire2 = True
        EndIf
        If Floor($TDiff / ($gTime3*1000)) > $gt3 Then
            $gt3 += 1
            $bFire3 = True
        EndIf
    
        If $bFire1 Then
            $bFire1 = False
            GUICtrlSendToDummy($dumTimer1)
        EndIf
        If $bFire2 Then
            $bFire2 = False
            GUICtrlSendToDummy($dumTimer2)
        EndIf
        If $bFire3 Then
            $bFire3 = False
            GUICtrlSendToDummy($dumTimer3)
        EndIf
    EndFunc
    Alles anzeigen

    Mit ein paar Jahren auf dem Buckel immer noch gut: Multi-Timer  8)

  • Passend zur Hintergrundfarbe helle oder dunkle Textfarbe automatisch setzen: _GuiCtrl_SetColorContrast

    • BugFix
    • 11. Juli 2022 um 12:41

    Kennt ihr sicher: Hintergrundfarbe für ein Ctrl gesetzt und schon ist der Text nicht mehr vernünftig lesbar.

    Ich habe nun mal mit Komplementärfarben und (fixen) Kontrastfarben gespielt - s. Bsp.
    Für die Komplementärfarben hatte ich mich am Farbkreis von Itten orientiert. Wenn die Farben großflächig nebeneinander dargestellt sind ist das brauchbar, aber bei Text auf farbigem Grund nicht wirklich immer.
    Somit errechne ich jetzt die Helligkeit der zu setzenden Hintergrundfarbe und wähle dann die festgelegte Textfarbe für hellen/dunklen Hintergrund.

    In der Standardeinstellung ist das ein tiefes Blau und ein Fast-Weiß. Das ist aber direkt im Funktionsaufruf anpassbar.

    EDIT: Ich habe mal die Helligkeitsschwelle auf 140 gesetzt. Dann wird Rot auch als dunkle Farbe betrachtet - ist dann besser lesbar.

    AutoIt: _GuiCtrl_SetColorContrast
    ; #FUNCTION# =======================================================================================
    ; Name ..........: _GuiCtrl_SetColorContrast
    ; Description ...: Sets the background color for a control and depending on its brightness the
    ; ...............: appropriate contrast color for the text.
    ; Parameter(s)...: $_ID           The control ID
    ; ...............: $_BkCol        The background color
    ; ....[optional].: $_ColOnDark    The text color if BG is dark (Default: -1, almost white)
    ; ....[optional].: $_colOnBright  The text color if BG is bright (Default: -1, very deep blue)
    ; Return values .: Success  1
    ; ...............: Failure  0
    ; Author ........: BugFix
    ; ==================================================================================================
    Func _GuiCtrl_SetColorContrast($_ID, $_BkCol, $_ColOnDark=-1, $_colOnBright=-1)
        $_ColOnDark = $_ColOnDark = -1 ? 0xFAFAFA : $_ColOnDark
        $_colOnBright = $_colOnBright = -1 ? 0x000088 : $_colOnBright
        GUICtrlSetBkColor($_ID, $_BkCol)
        ; get contrast
        Local $R = BitAND(BitShift($_BkCol, 16), 0xFF)
        Local $G = BitAND(BitShift($_BkCol, 8), 0xFF)
        Local $B = BitAND($_BkCol, 0xFF)
        Local $Brightness = Sqrt($R^2*0.299 + $G^2*0.587 + $B^2*0.114)
    ;~     Local $iCol = $Brightness < 128 ? $_ColOnDark : $_colOnBright
        Local $iCol = $Brightness < 140 ? $_ColOnDark : $_colOnBright  ; Rot wird dann auch als dunkel betrachtet
        Return GUICtrlSetColor($_ID, $iCol)
    EndFunc
    Alles anzeigen
    AutoIt: Beispiel
    ;-- TIME_STAMP   2022-07-11 12:27:02
    
    Global $aBGcol[] = [0x110000,0x440000,0x770000,0xA10000,0xFF0000, _
                        0x001100,0x004400,0x007700,0x00A100,0x00FF00, _
                        0x000011,0x000044,0x000077,0x0000A1,0x0000FF, _
                        0xF5F5DC,0x7FFF00,0xDC143C,0x00FFFF,0xFFD700, _
                        0xADFF2F,0xF0FFF0,0x4B0082,0xE6E6FA,0xFFFACD]
    
    
    GUICreate('Test: Komplementär vs. Kontrast', 360, 650)
    Global $x = 10, $y = 10
    
    For $i = 0 To UBound($aBGcol) -1
        GUICtrlCreateLabel('0x' & Hex($aBGcol[$i], 6), $x, $y, 80)
        $x += 90
        GUICtrlCreateLabel('  << COMPLEMENT >>', $x, $y, 120, 17)
        GUICtrlSetBkColor(-1, $aBGcol[$i])
        GUICtrlSetColor(-1, _RGB_GetComplement($aBGcol[$i]))
        $x += 130
        GUICtrlCreateLabel('  << CONTRAST >>', $x, $y, 120, 17)
        _GuiCtrl_SetColorContrast(-1, $aBGcol[$i])
        $x = 10
        $y += 25
    Next
    
    GUISetState()
    
    Do
    Until GUIGetMsg() = -3
    
    
    
    Func _RGB_GetComplement($_RGB)
        ; Farbkreis von Itten
        ; additive Farbmischung: Komplementärfarben löschen sich gegenseitig aus
        Local $cR = 0xFF - BitAND(BitShift($_RGB, 16), 0xFF)
        Local $cG = 0xFF - BitAND(BitShift($_RGB, 16), 0xFF)
        Local $cB = 0xFF - BitAND($_RGB, 0xFF)
        Return '0x' & Hex($cR, 2) & Hex($cG, 2) & Hex($cB, 2)
    EndFunc
    
    
    
    ; #FUNCTION# =======================================================================================
    ; Name ..........: _GuiCtrl_SetColorContrast
    ; Description ...: Sets the background color for a control and depending on its brightness the
    ; ...............: appropriate contrast color for the text.
    ; Parameter(s)...: $_ID           The control ID
    ; ...............: $_BkCol        The background color
    ; ....[optional].: $_ColOnDark    The text color if BG is dark (Default: -1, almost white)
    ; ....[optional].: $_colOnBright  The text color if BG is bright (Default: -1, very deep blue)
    ; Return values .: Success  1
    ; ...............: Failure  0
    ; Author ........: BugFix
    ; ==================================================================================================
    Func _GuiCtrl_SetColorContrast($_ID, $_BkCol, $_ColOnDark=-1, $_colOnBright=-1)
        $_ColOnDark = $_ColOnDark = -1 ? 0xFAFAFA : $_ColOnDark
        $_colOnBright = $_colOnBright = -1 ? 0x000088 : $_colOnBright
        GUICtrlSetBkColor($_ID, $_BkCol)
        ; get contrast
        Local $R = BitAND(BitShift($_BkCol, 16), 0xFF)
        Local $G = BitAND(BitShift($_BkCol, 8), 0xFF)
        Local $B = BitAND($_BkCol, 0xFF)
        Local $Brightness = Sqrt($R^2*0.299 + $G^2*0.587 + $B^2*0.114)
    ;~     Local $iCol = $Brightness < 128 ? $_ColOnDark : $_colOnBright
        Local $iCol = $Brightness < 140 ? $_ColOnDark : $_colOnBright  ; Rot wird dann auch als dunkel betrachtet
        Return GUICtrlSetColor($_ID, $iCol)
    EndFunc
    
    
    #cs  in Funktion integriert
    Func _RGB_GetContrast($_RGB, $_ColOnDark=0xFAFAFA, $_colOnBright=0x000088)
        ; get brightness
        Local $R = BitAND(BitShift($_RGB, 16), 0xFF)
        Local $G = BitAND(BitShift($_RGB, 8), 0xFF)
        Local $B = BitAND($_RGB, 0xFF)
        Local $Brightness = Sqrt($R^2*0.299 + $G^2*0.587 + $B^2*0.114)
    ;~    If $Brightness < 128 Then  ; dark
        If $Brightness < 140 Then  ; dark
            Return $_ColOnDark     ; contrast text color if background is dark
        Else
            Return $_colOnBright   ; contrast text color if background is bright
        EndIf
    EndFunc
    #ce
    Alles anzeigen
  • Tab ohne Hintergrundfarbe

    • BugFix
    • 11. Juli 2022 um 12:17
    Zitat von Alina

    Muss das hier nicht $TabItem_3 heißen?

    In Zeile 25 - ja Copy & Paste Error ^^

  • Tab ohne Hintergrundfarbe

    • BugFix
    • 11. Juli 2022 um 11:58
    Zitat von Tweaky

    Ich habe mal mit _WinAPI_GetSysColor($COLOR_MENU) die Farbe ermittelt. Ist dies wirklich die Hintergrundfarbe des Fensters oder nur die gleiche von einem anderen Element?

    Kann ich nicht mit Gewissheit sagen. Bei mir war es übereinstimmend, $COLOR_WINDOW brachte jedoch völlig falsche Farben.

  • Tab ohne Hintergrundfarbe

    • BugFix
    • 11. Juli 2022 um 09:37
    Zitat von Tweaky

    Wie kann man die Hintergrundfarbe der GUI auslesen?

    AutoIt
    #include <WinAPISysWin.au3>
    #include <WindowsConstants.au3>
    
    $RGB_BG = _WinAPI_GetSysColor($COLOR_MENU)  ; "$COLOR_WINDOW - Window background" sollte dem Namen nach das richtige sein - liefert aber die falsche Farbe. _MENU passt bei mir

    Ich hatte mal versucht mit "WM_DRAWITEM" die Tabs zu färben. Gefiel mir aber nicht so sehr. Vielleicht kannst du es als Idee nutzen:

    AutoIt
    ;-- TIME_STAMP   2012-06-30 21:33:51
    
    #include <FontConstants.au3>
    #include <TabConstants.au3>
    #include <WinAPI.au3>
    #include <GuiConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiTab.au3>
    
    Global Const $ODT_TAB        = 101
    Global Const $ODS_SELECTED   = 0x0001
    Global Const $ODA_DRAWENTIRE = 0x1
    Global Const $ODS_FOCUS      = 0x0010
    
    Global $aColTabItem[3][2] = [['Item1',0x11AADD],["Item2",0xEEBB99],["Item3",0x4763FF]] ; [[TabItem-Bezeichnung,TabItem-Color]]
    Global $hFont, $iBrush
    
    $hGUI = GUICreate("Draw Tab", 300, 200)
    $hTab = GUICtrlCreateTab(10, 10, 280, 180, $TCS_OWNERDRAWFIXED)
    $TabItem_1 = GUICtrlCreateTabItem("Item1") ; Bezeichnung im Array $aColTabItem muss identisch, wie hier sein!
    ; == erst alle Ctrl für Tab-Item_1 erstellen, dann das nächste Tab usw.
    GUICtrlCreateLabel('Label-TAB_1',30,50)
    $TabItem_2 = GUICtrlCreateTabItem("Item2")
    GUICtrlCreateLabel('Label-TAB_2',30,50)
    $TabItem_2 = GUICtrlCreateTabItem("Item3")
    GUICtrlCreateLabel('Label-TAB_3',30,50)
    GUICtrlCreateTabItem("")
    
    GUISetState()
    
    GUIRegisterMsg($WM_DRAWITEM, "WM_DRAWITEM")
    
    _GUICtrlTab_SetCurSel($hTab, 2)
    _GUICtrlTab_SetCurSel($hTab, 1)
    _GUICtrlTab_SetCurSel($hTab, 0)
    _GUICtrlTab_SetCurFocus($hTab, 1)
    
    
    
    Do
    Until GUIGetMsg() = -3
    _WinAPI_DeleteObject($iBrush)
    
    
    Func WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam)
        Local $DRAWITEMSTRUCT = DllStructCreate("uint cType;uint cID;uint itmID;uint itmAction;uint itmState;" & _
                                "hwnd hItm;hwnd hDC;dword itmRect[4];dword itmData", $lParam)
        If DllStructGetData($DRAWITEMSTRUCT, "cType") <> $ODT_TAB Then Return $GUI_RUNDEFMSG
        If DllStructGetData($DRAWITEMSTRUCT, "itmAction") <> $ODA_DRAWENTIRE Then Return $GUI_RUNDEFMSG
        Local $itmID = DllStructGetData($DRAWITEMSTRUCT, "itmID")
        Local $hDC   = DllStructGetData($DRAWITEMSTRUCT, "hDC")
        Local $hItm  = DllStructGetData($DRAWITEMSTRUCT, "hItm")
        Local $itmText = $aColTabItem[$itmID][0], $iBrushColor = $aColTabItem[$itmID][1]
    
        DLLCall("gdi32.dll","int","SetBkMode", "hwnd", $hDC, "int", 1)
    
        Local $iBrush = DLLCall("gdi32.dll","hwnd","CreateSolidBrush", "int", $iBrushColor)
        $iBrush = $iBrush[0]
    
        Local $iBrushOld = _WinAPI_SelectObject($hDC, $iBrush)
        DLLCall("user32.dll","int","FillRect", "hwnd", $hDC, "ptr", DllStructGetPtr($DRAWITEMSTRUCT, "itmRect"), "hwnd", $iBrush)
        Local $tBuffer = DllStructCreate("char[256]")
        DllStructSetData($tBuffer, 1, $itmText)
        $itmText = DllStructGetData($tBuffer, 1)
    
        DllStructSetData($DRAWITEMSTRUCT, "itmRect", DllStructGetData($DRAWITEMSTRUCT, "itmRect", 1) + 10, 1)
        DllStructSetData($DRAWITEMSTRUCT, "itmRect", DllStructGetData($DRAWITEMSTRUCT, "itmRect", 2) + 5, 2)
    
        DllCall("user32.dll", "int", "DrawText", "hwnd", $hDC, "str", $itmText, "int", StringLen($itmText), _
                "ptr", DllStructGetPtr($DRAWITEMSTRUCT, "itmRect"), "int", $DT_LEFT)
    
        Return $GUI_RUNDEFMSG
    EndFunc
    Alles anzeigen
  • UEFA EURO 2020 Tipp Wettbewerb

    • BugFix
    • 5. Juli 2022 um 17:18

    @RonaldLewis

    Im Off Topic zu spammen - das muss man erst mal bringen!

    Also reiß dich am Riemen, sonst bist du schneller gekickt, als du Spam sagen kannst.

  • Wenn eine Taste gedrückt wurde, soll zu einer anderen Stelle im Programm gesprungen werden

    • BugFix
    • 5. Juli 2022 um 12:08

    Vor allem vergiss "goto"! Das gibt es nicht in AutoIt.

    Erstelle für separate Programmteile Funktionen, die du bei Bedarf aufrufst.

  • HP Bioseinstellung mit WMI ändern

    • BugFix
    • 1. Juli 2022 um 09:29

    HP BIOS Settings

    C++
    class HP_BIOSSettingInterface
    { 
     [implemented] void SetBIOSSetting( 
     [out, ValueMap {"0","1","2","3","4","5","6"}, 
     Values {"Success","Not Supported","Unspecified Error", 
     "Timeout","Failed","Invalid Parameter","Access Denied"}] 
     uint32 Return, 
     [in] string Name, 
     [in] string Value, 
     [in, optional] string Password); 
     [implemented] void SetSystemDefaults( 
     [out: ToSubclass ToInstance, 
     [out, ValueMap {"0","1","2","3","4","5","6"}, 
     Values {"Success","Not Supported","Unspecified Error", 
     "Timeout","Failed","Invalid Parameter","Access Denied"}] 
     uint32 Return, 
     [in, optional] string Password);
    };
    Alles anzeigen

    HP BIOS Settings Management

    PowerShell
    #Set a specific value for a specific setting when a BIOS password is set
    $Interface.SetBIOSSetting("PARAMETER","VALUE","<utf-16/>" + "Password")

    Somit muss deine Befehlszeile lauten, wie in @Oscars Bsp.

    Zitat von hipfzwirgel

    Es müsste ja bei falschen Parametern "Invalid Parameter" kommen.

    Kommt drauf an, wie du "falsch" interpretierst:

    For reference, these are the possible return codes for the SetBIOSSetting method:

    • 0 – Success
    • 1 – Not Supported
    • 2 – Unspecified Error
    • 3 – Timeout
    • 4 – Failed (Usually caused by a typo in the setting value)
    • 5 – Invalid Parameter
    • 6 – Access Denied (Usually caused by an incorrect BIOS password)

    Was durch die Return Codes jedoch nicht abgedeckt wird, ist ein möglicher Security Konflikt. Rechte Probleme im Bereich der BIOS Manipulation (durch ein AutoIt-Skript) könnte ich mir gut vorstellen

    Configuring WMI Security

    HP Client Management Interface Technical White Paper

    Code
    Windows Management Instrumentation (WMI) security is based on namespaces. The WMI schema is logically partitioned into namespaces for organizational and security purposes. This partitioning allows for varying security configurations to be applied to each namespace within the schema, or common security configurations to be inherited between namespaces within the schema. The WMIMGMT.MMC Microsoft Management Console (MMC) snap-in allows system administrators to modify the security attributes on WMI namespaces. In this tool, you can set security that is based off of the root or select individual namespaces. You can also use inheritance that is based on namespace hierarchy.
    Use the following steps to modify WMI namespace security:
    1. Click Start, click Run, type wmimgmt.msc, and then click Enter.
    2. Right-click WMI Control, and then click on Properties from the context menu.
    3. Click the Security tab to see the namespace navigation pane.
    4. Highlight a namespace and click the Security button to see the allowable permissions.
    5. Set the inheritance on the namespace.
       Enable:          To grant read access to objects within the namespace.
       Execute Methods: Allows object methods exported from the CIM Object Manager to be run.
       Full Control:    To grant full read/write/delete access to all CIM objects, classes, and instances.
       Partial Write:   To grant write access to static objects in the repository.
       Provider Write:  To grant write access to objects that are provided by the provider.
       Read Security:   To grant read-only access to WMI security information.
       Edit Security:   To grant read/write access to WMI security information.
       Remote Access:   To grant a remote computer the same rights that are allowed when connecting from a local computer.
    Alles anzeigen
  • Editfeld updaten

    • BugFix
    • 27. Juni 2022 um 18:21
    Zitat von Velted

    Es wäre nicht falsch, wenn die Hilfe-Datei darauf hinweisen würde.

    Steht doch eindeutig drin:

    Zitat von AutoIt Hilfe

    Function FileWrite

    Write text/data to the end of a previously opened file.

  • Gnuplot einbinden in Autoit?

    • BugFix
    • 27. Juni 2022 um 14:10
    Zitat von uuchip

    Besser und moderner wäre allerdings eine DLL-Anbindung oder eine pipe nach Gnuplot.

    Besser?

    - Was sind die Kriterien für besser, wenn etwas funktioniert?

    Moderner?

    - Modern heisst Zeitgeist, also etwas, was nicht funktionell ist sondern vorrangig schön anzuschauen ist. :P

    Hab mal kurz reingeschaut. zumindest dem Manual ist nicht zu entnehmen, dass ein anderes Interface als das Einlesen von Dateien existiert. Und der große Vorteil ist ja gerade die Verarbeitung von Dateien, völlig egal von welchem Programm diese kommen.

  • Kürzen bei mehrfachem StringRegExpReplace in direkter Folge ???

    • BugFix
    • 26. Juni 2022 um 07:31
    Zitat von Alina

    Das ist mal kurz. Nicht das mein o. g. nicht auch die Lsg. ausgegeben hätte.

    Natürlich kann man das so lösen. Aber ich sehe keinen vernünftigen Grund die Regexfunktionen zu verwenden. Deren Nutzen ist doch unterschiedlichen Text mit bestimmten Mustern zu filtern.

    Du ersetzt doch aber nur feste Textwerte mit anderen festen Textwerten. ("10" mit "A", "11" mit "B" usw.)

    Dafür gibt es StringReplace. Und unbedingt den Hinweis von Oscar beachten. Denn das funktioniert nur, wenn jede Ziffer 2-stellig dargestellt ("01", "02".."10") und auch in 2-er Blöcken verarbeitet wird.

    EDIT:

    Wobei - Es ist Umwandeln zu Hex. Dafür gibt es die Funktion Hex. Wenn Deine Zahlenblöcke nicht größer als 15 sind (dürfen sie nicht sein! sonst wird der Hexstring unterschiedlich lang, was es unmöglich macht, den Ausgangsstring zu reproduzieren - was ja wohl dein Ziel ist) in einer Schleife über den String iterieren und mit $sResult &= Hex(StrMid(STR, pos, 2), 1) umwandeln.

  • Variable nach einem String benennen $($string)

    • BugFix
    • 22. Juni 2022 um 11:49
    Zitat von XxBlueTomatoXx

    ich versuche das nun dynamisch zu lösen damit ich Buttons einfach im array $rechnerbuttonlist hinzufügen kann und diese automatisch in Reihe und Spalte erzeugt werden

    Exakt das macht mein Beispiel. Wenn mehrere Button nebeneinander erstellt werden sollen, musst du auch $x in der Schleife berechnen.

    EDIT: Aber überleg lieber, ob diese Lösung sinnvoll ist. Bei veränderlicher Anzahl von Aufgaben (für die die Button ja stehen) ist die bessere Lösung ein Listview und dazu ein Button "Ausführen". Dann selektiert der User die Aufgabe in der Liste und klickt den Button. Ist auch vom Handling wesentlich geschmeidiger.

    Für eine volldynamische Lösung muss dann aber auch die GUI angepasst werden. Hier ein Bsp. mit Inputfeldern, wie das geht.:

    AutoIt
    Global $GUI, $aInput[2] = [1], $btAdd
    
    $GUI = GUICreate('Test', 400, 50)
    $aInput[1] = GUICtrlCreateInput('', 10, 10, 300, 21)
    GUICtrlSetResizing(-1, 802) ; $GUI_DOCKALL
    $btAdd = GUICtrlCreateButton('Add Input', 320, 10, 70, 21)
    GUICtrlSetResizing(-1, 802) ; $GUI_DOCKALL
    GUISetState()
    
    While 1
        Switch GUIGetMsg()
            Case -3
                Exit
            Case $btAdd
                _NewCtrl()
        EndSwitch
    WEnd
    
    Func _NewCtrl()
        Local $iDiff = 31     ; == Abstand + Höhe ==> 10 + 21
        Local Static $iY = 10 ; == Startwert vom ersten Ctrl
        $iY += $iDiff
        $aInput[0] += 1
        ReDim $aInput[$aInput[0]+1]
        Local $aWin = WinGetPos($GUI)
        WinMove($GUI, '', $aWin[0], $aWin[1], $aWin[2], $aWin[3] + 31)
        $aInput[$aInput[0]] = GUICtrlCreateInput('', 10, $iY, 300, 21)
        GUICtrlSetResizing(-1, 802) ; $GUI_DOCKALL
    EndFunc
    Alles anzeigen
  • Variable nach einem String benennen $($string)

    • BugFix
    • 22. Juni 2022 um 09:39
    Zitat von XxBlueTomatoXx

    Ich finde leider keine Lösung wie ich eine Variable nach einem String bennen kann.

    Welchen Vorteil bringt dir das denn, bzw. warum soll das erforderlich sein, dass ein Text ausgewählt wird und dann eine Variable der Form $TEXT gebildet wird?

    Variablen sind nur Container, ihr Name ist völlig wumpe, er muss nur eindeutig sein. Wichtig ist deren Inhalt.

    Erklär mal, was du genau vorhast, dann können wir dir auch einen Lösungsansatz bieten. Eval & Assign sind Krücken, die man tunlichst vermeiden sollte und in 99,99% der Programmierung auch tatsächlich nicht braucht.


    EDIT:

    Ich vermute, Du meinst sowas:

    AutoIt
    Global $list = "AA|BB|CC"
    Global $arr = StringSplit($list, "|", 2)
    ;~ Global $funktioniert = "Es|hat|funktioniert"
    ;~ Global $arrfunktioniert = StringSplit($list, "|")
    
    GUICreate('Test')
    $Max = UBound($arr)     ; get array size
    Global $aButton[$Max]
    Global $x = 10, $y
    
    For $i = 0 To UBound($arr) -1
        $y = 10 + $i*30
        $aButton[$i] = GUICtrlCreateButton($arr[$i], $x, $y, 100, 20)
    Next
    
    GUISetState()
    
    Global $nMsg
    While 1
        $nMsg = GUIGetMsg()
        For $i = 0 To UBound($aButton) -1
            If $nMsg = $aButton[$i] Then
                MsgBox(0, 'Click', 'Button: ' & GUICtrlRead($aButton[$i]))
                ExitLoop
            EndIf
        Next
        If $nMsg = -3 Then Exit
    WEnd
    Alles anzeigen
  • Hilfestellung bei DllCall der zint.dll

    • BugFix
    • 21. Juni 2022 um 20:43
    Zitat von Schnuffel

    ich möchte mit der zint.dll einen DataMatrix Barcode als bmp speichern.

    Ich habe mir mal einige c files reingezogen. Ich weiß nicht, ob es sehr sinnvoll ist, das über die DLL anzusprechen.

    Unabhängig davon, dass ich noch (mindstens) 1 Fehler in meiner Structumsetzung gefunden habe, ist es ziemlich intensiv die Strukturen mit Daten zu befüllen.

    So, wie ich das bisher verstehe, muss man so vorgehen.

    1. Structs: ZINT_RENDER_LINE, ZINT_RENDER_STRING, ZINT_RENDER_RING, ZINT_RENDER_HEXAGON erstellen und mit Daten füllen

    2. Struct ZINT_RENDER erstellen mit Daten - u.A. Pointer auf die 4 vorigen Strukturen - befüllen

    3. Jetzt wird die zentrale Struktur ZINT_SYMBOL erstellt und auch darin die vorab befüllte Struct ZINT_RENDER als Pointer eingefügt. Dann werden eine Unzahl an weiteren möglichen Parametern gesetzt, die auch regeln, welche Art von Barcode generiert wird.

    Mit dieser zentralen Struktur kann dann die DLL aufgerufen werde.

    Soweit die Theorie. Auf Seite 34-35 im Manual sind die Strukturparameter (etwas) näher erklärt. (Da ist übrigens ein Schreibfehler: Der Parameter "encoded_data" wird dort als "encoding_data" bezeichnet.)

    Wie und welche Daten man in das Array encoding_data steckt... nur Fragezeichen.

    Ich würde überlegen, einfach mit der zint.exe zu Arbeiten. Diese ist CLI-fähig und soweit ich das im Manual sehe, ist das leichter zu handeln als der DLL-Zugriff.

    EDIT: Gerade CLI ausprobiert - Das ist wirklich easy! Kann ich nur empfehlen.

    zint -b QRCODE --border=1 --box -d "Gerade CLI ausprobiert - Das ist wirklich easy!" --quietzones

    zint -o matrix.bmp -b DATAMATRIX --whitesp=1 --vwhitesp=1 -d "Das ist ein Test mit Datamatrix"

    matrix.bmp

  • An und Verkauf Programm

    • BugFix
    • 21. Juni 2022 um 19:24

    OK, das wäre dann schon eine kleine Warenwirtschaft, die auf SQLite aufsetzt.

    Das zu Programmieren ist recht umfangreich. QR-Code Generator existiert als UDF von mir, könnte man also integrieren.

    Das ist alles nicht schwer umzusetzen und auch kein Hexenwerk, aber eine Menge Arbeit. Da brauchst du jemanden mit ausreichend Zeit.

    Für mich zur Zeit nicht drin.

  • An und Verkauf Programm

    • BugFix
    • 21. Juni 2022 um 18:43

    SQL Datenbank - OK, je nach Verarbeitungsart (User die evtl. zeitgleich zugreifen) kann man das entsprechende System aussuchen.

    Bei Ein-User-Nutzung ist SQLite sicher eine gute Lösung, ansonsten vielleicht MySQL.

    Da musst du deine Anforderungen etwas genauer schildern, damit man sich einen Überblick verschaffen kann.

  • An und Verkauf Programm

    • BugFix
    • 21. Juni 2022 um 18:22

    Solange du nicht Unmengen von Artikeln handelst, würde ich die einfachste Lösung wählen: Excel.

    Eine Tabelle mit Ankauf, eine mit Verkauf. Mit VBA eine minimale Oberfläche erstellen zum Daten Erfassen und Verschieben bei Verkauf.

    Ist funktionell und übersichtlich.

    Ansonsten gibt es sogar für Kleinstunternehmen Freeware Produkte für eine minimalistische Warenwirtschaft, die all das beinhaltet.

    EDIT: z.B. gratis bis 5000 Belege pro Kalenderjahr: Vario

  • Zugriff auf COM Methode

    • BugFix
    • 21. Juni 2022 um 14:04
    Zitat von uuchip

    AuoIt ist so schlau das sogar als Feld zu erkennen. Aber ich bin nicht so schlau jetzt mit den 3200 Eintägen zurecht zu kommen.

    Prüfe als was es zurückgegeben wird:

    IsArray() - AutoIt-Array

    IsObj() - Ein Objekt, kann eine Liste, ein Objekt-Array sein oder ein Objekt von Objekten - kannst du meist mit For $element In durchgehen.

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™