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

Beiträge von BLinz

  • Einbinden einer DLL in AutoIT (VMware VIX)

    • BLinz
    • 1. Juni 2012 um 22:28

    Aufgrund einer Nachfrage poste ich hier mal ein funktionierendes Beispiel.

    Es nutzt nur die vix.dll und startet eine VM auf einem ESXi Server:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: myName

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    ;#include "VixH.au3"
    #include <Array.au3>

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

    Dim $vixdll
    Dim $aRes1
    Dim $aRes2
    Dim $tHandle
    Dim $hostHandle
    Dim $vmHandle
    Dim $jobHandle
    Dim $err
    Global Enum $VIX_PROPERTY_JOB_RESULT_HANDLE = 3010
    Global Enum $VIX_PROPERTY_NONE = 0
    Global Enum $VIX_INVALID_HANDLE = 0
    Global Enum $VIX_VMPOWEROP_NORMAL = 0

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

    Func ConsoleWriteArray (ByRef Const $array, $sArrayName = "")
    Local $cnColumns
    Local $cnDimension
    Local $cnRows
    Local $cnElements
    If (not IsArray ($array)) Then
    ConsoleWrite (StringFormat ("!--- ConsoleWriteArray - Fehler: %s ist kein Array!\n", $sArrayName))
    Return 0
    EndIf
    $cnDimension = UBound ($array, 0)
    If ($cnDimension > 3) Then
    ConsoleWrite (StringFormat ("!--- ConsoleWriteArray - Fehler: %d\n", $sArrayName, $cnDimension))
    ConsoleWrite (StringFormat ("!--- Max. Anzahl Dimensionen: %d\n", 3))
    ConsoleWrite (StringFormat ("!--- %s - Anzahl Dimensionen: %d\n", $sArrayName, $cnDimension))
    Return 0
    EndIf
    ConsoleWrite (StringFormat ("--- Arrayvariable %s\n--- Anzahl Dimensionen: %d\n", $sArrayName, $cnDimension))
    $cnRows = UBound ($array, 1)
    $cnColumns = UBound ($array, 2)
    $cnElements = UBound ($array, 3)
    Switch ($cnDimension)
    Case 1
    ;...
    ConsoleWrite (StringFormat ("--- Anzahl Elemente: %d\n", $cnRows))
    For $i = 0 To $cnRows - 1
    ConsoleWrite (StringFormat ("; %s [%d] = %s\n", $sArrayName, $i, $array[$i]))
    Next
    Case 2
    ;...
    ConsoleWrite (StringFormat ("--- Anzahl Elemente: %d\n", $cnRows))
    For $i = 0 To $cnRows - 1
    For $j = 0 To $cnColumns - 1
    ConsoleWrite (StringFormat ("; %s [%d][%d] = %s\n", $sArrayName, $i, $j, $array[$i][$j]))
    Next
    Next
    Case 3
    ;...
    ConsoleWrite (StringFormat ("--- Anzahl Elemente: %d\n", $cnRows))
    For $i = 0 To $cnRows - 1
    For $j = 0 To $cnColumns - 1
    For $k = 0 To $cnElements - 1
    ConsoleWrite (StringFormat ("; %s [%d][%d][%d] = %s\n", $sArrayName, $i, $j, $k, $array[$i][$j][$k]))
    Next
    Next
    Next
    Case Else
    ;...
    EndSwitch
    ConsoleWrite (StringFormat ("----------------------------\n\n", 0))
    EndFunc

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

    Func Vix_ReleaseHandle ($handle)

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

    Local $aRes = DllCall ($vixdll, "none", "Vix_ReleaseHandle", _
    "int", $handle) ; VixHandle
    Return $aRes[0]

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

    EndFunc

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

    Func VixVM_Open ($hostHandle, $vmxFilePathName, $callbackProc, $clientData)

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

    Local $aRes = DllCall ($vixdll, "INT:cdecl", "VixVM_Open", _
    "INT", $hostHandle, _
    "str", $vmxFilePathName, _
    "PTR", $callbackProc, _
    "PTR", $clientData)
    Return $aRes[0]
    EndFunc

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

    Func VixVM_PowerOn ($vmHandle, $powerOnOptions, $propertyListHandle, $callbackProc, $clientData)

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

    Local $aRes = DllCall ($vixdll, "INT:cdecl", "VixVM_PowerOn", _
    "INT", $vmHandle, _
    "INT", $powerOnOptions, _
    "INT", $propertyListHandle, _
    "PTR", $callbackProc, _
    "PTR", $clientData)
    Return $aRes[0]
    EndFunc

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

    Func VixJob_Wait ($jobHandle, $v1, $v2 = 0 , $v3 = 0 , $v4 = 0 , $v5 = 0 , $v6 = 0 , $v7 = 0 , $v8 = 0 , $v9 = 0 , $v10 = 0 , $v11 = 0)
    ConsoleWrite("NumParams:" & @NumParams & @CRLF)
    ;If Mod(@NumParams , 2) Then Return SetError(1,0,0)
    ;If Eval("v" & (@NumParams-1)) <> 0 Then Return SetError(2,0,0)
    Local $aRes
    Switch @NumParams
    Case 2
    ConsoleWrite("Case 2")
    $aRes = DllCall ($vixdll, "UINT64:cdecl", "VixJob_Wait", "int", $jobHandle, "int", $v1)
    Case 4
    $aRes = DllCall ($vixdll, "UINT64:cdecl", "VixJob_Wait", "int", $jobHandle, "int", $v1, "ptr", $v2, "int", $v3)
    Case 6
    $aRes = DllCall ($vixdll, "UINT64:cdecl", "VixJob_Wait", "int", $jobHandle, "int", $v1, "ptr", $v2, "int", $v3, "ptr", $v4, "int", $v5)
    Case 8
    $aRes = DllCall ($vixdll, "UINT64:cdecl", "VixJob_Wait", "int", $jobHandle, "int", $v1, "ptr", $v2, "int", $v3, "ptr", $v4, "int", $v5, "ptr", $v6, "int", $v7)
    Case 10
    $aRes = DllCall ($vixdll, "UINT64:cdecl", "VixJob_Wait", "int", $jobHandle, "int", $v1, "ptr", $v2, "int", $v3, "ptr", $v4, "int", $v5, "ptr", $v6, "int", $v7, "ptr", $v8, "int", $v9)
    Case 12
    $aRes = DllCall ($vixdll, "UINT64:cdecl", "VixJob_Wait", "int", $jobHandle, "int", $v1, "ptr", $v2, "int", $v3, "ptr", $v4, "int", $v5, "ptr", $v6, "int", $v7, "ptr", $v8, "int", $v9, "ptr", $v10, "int", $v11)
    EndSwitch
    If @error Then Return SetError(3, @error, 0)
    Return $aRes[0]
    EndFunc

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

    ;#####################################################################################################################################################################################
    ;#####################################################################################################################################################################################
    ;#####################################################################################################################################################################################
    ;#####################################################################################################################################################################################
    ;#####################################################################################################################################################################################

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

    ;Global $MyhostHandle = $VIX_INVALID_HANDLE
    ;Dim $MyjobHandle = $VIX_INVALID_HANDLE
    ;Dim $MyERR

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

    ;$vixdll = DllOpen ("vix.dll")
    ;If @error Then
    ; ConsoleWrite('Fehler beim Öffnen der DLL' & @CRLF)
    ; Exit
    ;EndIf
    ;ConsoleWrite ('"' & $vixdll & '"' & @CRLF)
    $vixdll = DllOpen("vix.dll")
    ConsoleWrite ($vixdll & "---" & @error & @CRLF)

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

    ;$aRes = DllCall ($vixdll, "INT", "VixHost_Connect", "INT", -1, "INT", 10, "str", "https://192.168.28.128/sdk", "INT", 443, "str", "root", "str", "test1234", "INT", 0, "INT", 0, "PTR", 0, "PTR", 0)
    $aRes1 = DllCall ($vixdll, "INT:cdecl", "VixHost_Connect", "INT", -1, "INT", 10, "str", "https://192.168.28.128/sdk", "INT", 443, "str", "root", "str", "test1234", "INT", 0, "INT", 0, "PTR", 0, "PTR", 0)
    ConsoleWrite("---" & @error & @CRLF)
    ConsoleWriteArray($aRes1)

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

    $tHandle = DllStructCreate("int")
    $err = VixJob_Wait ($aRes1[0], $VIX_PROPERTY_JOB_RESULT_HANDLE, DllStructGetPtr($tHandle), $VIX_PROPERTY_NONE)
    $hostHandle = DllStructGetData($tHandle, 1)
    ConsoleWrite("---" & @error & "----" & $hostHandle & @CRLF)
    ConsoleWrite("$err =" & $err & @CRLF)
    ;ConsoleWriteArray($hostHandle)
    $aRes1 = 0
    $tHandle = 0
    $jobHandle = 0

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

    $jobHandle = VixVM_Open ($hostHandle, "[ha-datacenter/datastore1] Nostalgia/Nostalgia.vmx", 0, 0)
    $tHandle = DllStructCreate("int")
    $err = VixJob_Wait ($jobHandle, $VIX_PROPERTY_JOB_RESULT_HANDLE, DllStructGetPtr($tHandle), $VIX_PROPERTY_NONE)
    $vmHandle = DllStructGetData($tHandle, 1)
    ConsoleWrite("---" & @error & "----" & $vmHandle & @CRLF)

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

    $tHandle = 0
    $jobHandle = 0

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

    ;$jobHandle = VixVM_PowerOn ($vmHandle, $VIX_VMPOWEROP_NORMAL, $VIX_INVALID_HANDLE, 0, 0)
    $aRes2 = DllCall ($vixdll, "INT:cdecl", "VixVM_PowerOn", "INT", $vmHandle, "INT", 0, "INT", 0, "PTR", 0, "PTR", 0)
    ConsoleWriteArray($ares2)

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

    $err = VixJob_Wait ($aRes2[0], $VIX_PROPERTY_NONE)
    ConsoleWrite("---" & @error & "----" & $err & @CRLF)

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

    DllClose($vixdll)

    [/autoit]

    Hier nochmal als zip inklusive der "Vorbereiteten" VIXEasy.au3 mit allen Befehlen zum includen und der DLL selbst (funzt mindestens bis ESX 4.1 U1)

    Dateien

    AutoIt-VMware.zip 1,44 MB – 275 Downloads
  • Happy Birthday Sprenger120 !!!

    • BLinz
    • 10. Dezember 2011 um 22:26

    Ich gratuliere auch ganz Herzlich ... Wirklich 16 ? Puhh das waren noch Zeiten damals ... da musste ich meinem Vater verheimlichen das ich mir für 350 Mark einen Modula-2 Compiler für meinen Amiga gekauft hatte.
    So viel Geld für eine 720K Diskette - das hätte er nie verstanden .... (nein, Internet "gab es noch nicht")

  • Um bestimmte Uhrzeit Programm ausführen

    • BLinz
    • 9. Dezember 2011 um 12:50
    Zitat von cashmoney

    ich empfehl dir schtasks!

    :D auch wieder etwas gelernt

  • Hotkey in Script einbauen

    • BLinz
    • 8. Dezember 2011 um 19:23

    Ich hoffe ersteinmal du nutzt Scite oder das ISN ... dann drück mal F1 (die Hilfe erscheint) und suche nach HotKeySet:

    [autoit]

    HotKeySet

    [/autoit]

    PS: heute Registriert, unter Projekte gleich einen Aufruf gestartet .... und dann eine Frage die du in der Suche hier oder mit Google oder - noch besser - im Inhaltsverzeichnis der Hilfe zu AutoIt hättest selber finden können.
    Das alles ist nicht schlimm - ich selbst stelle hier Fragen die hinterher banal erscheinen (Wenn man weis wonach man hätte suchen müssen) ... Aber dein Projketaufruf gleich einem nicht einfachen Thema ...

  • Robocopy

    • BLinz
    • 8. Dezember 2011 um 19:12
    Zitat von Xenobiologist

    Warum hast du die Controls nicht ordentlich mit Namen versehen?


    Ja das ist auch gerade mein Hauptproblem ... macht es nicht leicht.

    Eigentlich wäre Neuerstellen einfacher ... Sie hat mir die Form zugepostet ... aber wenn ich schon Programmiere würde ich es eventuell anders aufteilen - mal schauen

    Die Hits kommen meine ich wegen irgendeines Fehlers der Webseite, gab einige Posts die das hatten, musst unserer beiden Super-Admins mal fragen.

  • Um bestimmte Uhrzeit Programm ausführen

    • BLinz
    • 8. Dezember 2011 um 14:25

    Der Befehl hierzu heisst "at /?" - einfach mal in der DosBox eingeben, funktioniert seit Windows 2000 meine ich - und auch unter Windows 7.

    Hier die Anleitung von Microsoft dazu: http://support.microsoft.com/kb/313565/de

  • Happy Birthday "AutoIt.de"

    • BLinz
    • 8. Dezember 2011 um 11:50

    Na da gratuliere ich doch auch gerne! Auf die nächsten 6 Jahre - was immer uns die nächsten Windows Versionen auch bringen werden ....

  • Robocopy

    • BLinz
    • 8. Dezember 2011 um 11:12

    So dazwischen - sei nicht bös aber es steht auf der Prio-Liste nicht an erster Stelle.
    Zudem konnte ich seit 5 Tagen sowieso garnichts machen (private Gründe).

    Du darfst auch gerne selbst dich wieder reinfuchsen :rolleyes:

  • Happy Birthday pee, funkey und Co.

    • BLinz
    • 4. Dezember 2011 um 19:46
    [autoit]

    Dim $Gutelaune = "Jede Menge"
    Dim $Party = "bis zum frühen morgen"
    Dim $Glueck = "mehr als Sie brauchen"
    Dim $allesGute ="von BLinz"

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

    While $GEBURTSTAG = True
    _SendDieBestenWuensche("peethebee", $Gutelaune & $Party & $Glueck & $allesGute)
    _SendDieBestenWuensche("funkey", $Gutelaune & $Party & $Glueck & $allesGute)
    _SendDieBestenWuensche("Script-Bär", $Gutelaune & $Party & $Glueck & $allesGute)
    WEnd

    [/autoit]
  • Anfänger fragen, benötige Hilfe

    • BLinz
    • 3. Dezember 2011 um 23:07

    Naja, ich habe auch eine Weile gebraucht bis ich mich an die Bedienung der Forensoftware gewöhnt hatte ... Gerade im Editor Modus wird es doch oft ziemlich verwurschelt,
    Im Quellcode Modus geht es viel besser.
    Umgekehrt kann ich über den Kopieren-Button im Quellcode auch nicht herauskopieren - da kommt bei mir immer Mist raus.

  • Anfänger fragen, benötige Hilfe

    • BLinz
    • 3. Dezember 2011 um 22:38

    Ähm, du müsstest noch mal deinen Code im ersten Post neu reinkopieren ... ich bekomme es nicht sinnvoll herauskopiert (sieh einfach mal selbst)

  • [Beispiel] - Multi-Monitorkonfiguration ermitteln, grafisch darstellen und die Ränder der Monitore zueinander bzw. freie Ränder finden

    • BLinz
    • 3. Dezember 2011 um 00:30

    In meinem Slider Projekt habe ich das Problem, das unsinnige Seiten für das Sliderfenster nicht erkannt werden.
    Unsinnig ist z.B. die Position zwischen 2 Monitoren.

    also habe ich mir etwas geschrieben was die Postionen erkennt und darstellen kann - DisplayMonitorConfiguration.au3

    Features:

    • Anzahl und Größe der Monitore erkennen und Maßstabsgerecht zeichnen
    • Die freien Ränder der einzelnen Monitore ermitteln
    • Die freien Ränder anzeigen (wieder im Maßstab)
    • Die "Zeichnung" kann Platz in der GUI angepasst werden (Slider in Demo)
    • Anzahl und Auflösung der Monitore ist "unbegrenzt"

    Bilder aus der Praxis

    Meine Bildschirmanordnung:
    [Blockierte Grafik: http://znil.net/images/e/e9/DisplayMonitor001.JPG]

    Durch das Skript erkannte Darstellung:
    [Blockierte Grafik: http://znil.net/images/5/5d/DisplayMonitor002.JPG]

    Durch das Skript erkannte freien Ränder (Mit Darstellung meiner Monitore):
    [Blockierte Grafik: http://znil.net/images/7/70/DisplayMonitor003.JPG]

    Gegenprobe: Monitor 1 und 2+3 vertauscht, 2 und 3 liegen nun auf negativen Koordninaten
    [Blockierte Grafik: http://znil.net/images/8/87/DisplayMonitor004.JPG]

    Und was das Skript daraus macht:
    [Blockierte Grafik: http://znil.net/images/e/ed/DisplayMonitor005.JPG]

    Hier der Quellcode:

    Spoiler anzeigen
    [autoit]

    ; 12 / 2011 von BLinz - http://www.autoit.de
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <SliderConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    Global $aScreenDimension ; Hier kommen die Gesamtmaße (Gesamtbreite / Höhe) der Monitore rein zwecks Maßstabsbrechnung
    Global $aAllScreenswithDimensions ; Hier stehen Anzahl, Position und Maße aller Monitore drin
    Global $iResizeFaktor ; Um welchen Faktor müssen wir verkleinern beim Zeichnen
    Global $iZeroPointX, $iZeroPointY ; Wohin mit dem Nullpunkt auf unserer Zeichenfläche (wegen Negativen Koordinaten)
    Global $LabelMonitors[1] ; Zeiger auf die Label die die Monitore darstellen
    Global $aUseableMonitorMargins[1][4] ; Hier kommt für jede der 4 Seiten eine Monitors ein Wert rein
    ; ob diese Frei ist (True) oder an einen anderen angrenzt (False)
    Global $ButtonMargins[1] ; Die Ränder werden mit Buttons dargestellt, hier die Zeiger dafür
    Global $iDrawingSize = 300 ; Grundwert, Größe der Zeichenfläche, kann per Slider angepasst werden
    Global $iOldSliderValue ; Für Echtzeitvorschau wenn der Slider bewegt wird
    Global $bShowMargins = False ; Grundwert, nicht die Ränder zeigen an denen ein Slider Fenster hin könnte

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

    ;Wieder kleine GUI mit Koda ...
    #Region ### START Koda GUI section ### Form=c:\_autoit\z-slider\displaymonitorconfiguration.kxf
    $FormDisplayMonitorConfiguration = GUICreate("DisplayMonitorConfigurationDEMO", 615, 601, 409, 137)
    $Slider1 = GUICtrlCreateSlider(56, 496, 500, 45, BitOR($GUI_SS_DEFAULT_SLIDER,$TBS_TOP,$TBS_LEFT,$TBS_ENABLESELRANGE))
    $Label1 = GUICtrlCreateLabel("100px", 56, 480, 33, 17)
    $Label2 = GUICtrlCreateLabel("600px", 528, 480, 33, 17)
    $CheckboxShowPossibleSlider = GUICtrlCreateCheckbox("Zeige mögliche Positionen für ein Slider Fenster", 64, 544, 481, 17)
    $ButtonMonArray = GUICtrlCreateButton("Zeige Monitore-Array", 64, 568, 130, 25)
    $ButtonMarginArray = GUICtrlCreateButton("Zeige freie Seiten Array", 336, 568, 130, 25)
    $ButtonScreenDims = GUICtrlCreateButton("Zeige BildschirmDims", 200, 568, 130, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ;Slider auf Startwert setzen
    GUICtrlSetData($Slider1, ($iDrawingSize - 100) / 5)
    $iOldSliderValue = GUICtrlRead($Slider1)

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

    ;Gesamte Bildschrimausmaße über alle Monitore ermitteln,
    ; Ergibt auch bei Monitoren mit negativen Koordinaten die Gesamtbreite / -höhe
    $aScreenDimension = WinGetPos("Program Manager")
    ;$aScreenDimension[0] = X-Position
    ;$aScreenDimension[1] = Y-Position
    ;$aScreenDimension[2] = Breite
    ;$aScreenDimension[3] = Höhe

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

    ;_ArrayDisplay($aScreenDimension)

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

    ;Umrechnungsfaktor für unsere (momentan 300 x 300) Fläche ermitteln
    If $aScreenDimension[2] > $aScreenDimension[3] Then
    $iResizeFaktor = $iDrawingSize / $aScreenDimension[2]
    Else
    $iResizeFaktor = $iDrawingSize / $aScreenDimension[3] ;
    EndIf

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

    ;Nullpunkte für unsere (momentan noch 300 x 300) Fläche ermitteln
    ; 0 = 300 - 300 / ( 3600 / ( 0 + 3600))
    ; 140 = 300 - 300 / ( 3600 / ( -1680 + 3600))
    $iZeroPointX = $iDrawingSize - ($iDrawingSize / ($aScreenDimension[2] / ($aScreenDimension[0] + $aScreenDimension[2])))
    ;Nun kann es sein das ein negativer Wert herauskommt - dann in positiv wandeln
    If $iZeroPointX < 0 Then $iZeroPointX = $iZeroPointX * (-1)
    ;Das selbe noch einmal für Y Achse
    $iZeroPointY = $iDrawingSize - ($iDrawingSize / ($aScreenDimension[3] / ($aScreenDimension[1] + $aScreenDimension[3])))
    If $iZeroPointY < 0 Then $iZeroPointX = $iZeroPointY * (-1)

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

    ; Anzahl und Auflösung der einzelnen Monitore holen
    $aAllScreenswithDimensions = _GetMonitors()
    ; $aAllScreenswithDimensions[0][0] with number of Monitors,
    ; $aAllScreenswithDimensions[x][0] Monitor X Screen wide
    ; $aAllScreenswithDimensions[x][1] Monitor X Screen height
    ; $aAllScreenswithDimensions[x][2] Monitor X Screen Position X
    ; $aAllScreenswithDimensions[x][3] Monitor X Screen Position Y

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

    ; Ermitteln an welchen Rändern die Monitore "zusammenstoßen" bzw. verbunden sind
    Redim $aUseableMonitorMargins[$aAllScreenswithDimensions[0][0] + 1][4]
    $aUseableMonitorMargins[0][0] = "Links"
    $aUseableMonitorMargins[0][1] = "Rechts"
    $aUseableMonitorMargins[0][2] = "Oben"
    $aUseableMonitorMargins[0][3] = "Unten"
    ; $aUseableMonitorMargins[x][0] = Left Margin
    ; $aUseableMonitorMargins[x][1] = Right Margin
    ; $aUseableMonitorMargins[x][2] = Top Margin
    ; $aUseableMonitorMargins[x][3] = Bottom Margin

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

    ; Ermittel welcher Monitor wo steht und an welchen Seiten diese aneinander stoßen
    _GetMonitorMargins()

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

    ;Die Monitore stellen wir durch Labels dar - Anzahl dimensonieren
    ReDim $LabelMonitors[$aAllScreenswithDimensions[0][0] + 1]
    $LabelMonitors[0] = $aAllScreenswithDimensions[0][0]
    ;Die freien Ränder durch Buttons - einfach Monitore * 4 - sind zwar bestimmt zuviel aber nie zuwenig
    Redim $ButtonMargins[$aAllScreenswithDimensions[0][0] * 4]

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

    ;Monitore zeichnen
    _DrawMonitors()

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

    ;Hauptschleife zur Abfrage der GUI
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $CheckboxShowPossibleSlider
    ;Ok, jemand will die freien Seiten sehen (oder nicht mehr sehen)
    If BitAnd(GUICtrlRead($CheckboxShowPossibleSlider),$GUI_CHECKED) = $GUI_CHECKED Then
    $bShowMargins = True ; Anzeigen
    Else
    $bShowMargins = False ; Nicht anzeigen
    EndIf
    ;Einmal alles neu Zeichnen lassen
    _DeleteMonitors()
    _DrawMonitors()
    Case $ButtonMonArray
    _ArrayDisplay($aAllScreenswithDimensions)
    Case $ButtonMarginArray
    _ArrayDisplay($aUseableMonitorMargins)
    case $ButtonScreenDims
    _ArrayDisplay($aScreenDimension)
    EndSwitch
    ;Echtzeitvorschau des Sliders, neu zeichnen wenn der Wert sich ändert
    If $iOldSliderValue <> GUICtrlRead($Slider1) Then
    $iDrawingSize = (GUICtrlRead($Slider1) * 5) + 100 ;Slider ist von 0 bis 100, Werte aber von 100 bis 600
    ; Verkleinerungsfaktor neu ausrechnen
    If $aScreenDimension[2] > $aScreenDimension[3] Then
    $iResizeFaktor = $iDrawingSize / $aScreenDimension[2]
    Else
    $iResizeFaktor = $iDrawingSize / $aScreenDimension[3]
    EndIf
    $iOldSliderValue = GUICtrlRead($Slider1)
    $iZeroPointX = $iDrawingSize - ($iDrawingSize / ($aScreenDimension[2] / ($aScreenDimension[0] + $aScreenDimension[2])))
    If $iZeroPointX < 0 Then $iZeroPointX = $iZeroPointX * (-1)
    $iZeroPointY = $iDrawingSize - ($iDrawingSize / ($aScreenDimension[3] / ($aScreenDimension[1] + $aScreenDimension[3])))
    If $iZeroPointY < 0 Then $iZeroPointX = $iZeroPointY * (-1)
    _DeleteMonitors()
    _DrawMonitors()
    EndIf
    WEnd

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

    ;löscht alle gezeichten Labels und Buttons
    Func _DeleteMonitors()
    For $i = 1 To $LabelMonitors[0]
    GUICtrlDelete($LabelMonitors[$i])
    Next
    For $i = 0 To UBound($ButtonMargins) - 1
    GUICtrlDelete($ButtonMargins[$i])
    Next
    EndFunc

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

    ;Zeichnet die Monitore und ggf. Buttons Maßstabsgerecht
    ; $aAllScreenswithDimensions[0][0] with number of Monitors,
    ; $aAllScreenswithDimensions[x][0] Monitor X Screen wide
    ; $aAllScreenswithDimensions[x][1] Monitor X Screen height
    ; $aAllScreenswithDimensions[x][2] Monitor X Screen Position X
    ; $aAllScreenswithDimensions[x][3] Monitor X Screen Position Y
    Func _DrawMonitors()
    Local $j = 0
    For $i = 1 To $LabelMonitors[0]
    $LabelMonitors[$i] = GUICtrlCreateLabel($i, 16 + $iZeroPointX + Floor($aAllScreenswithDimensions[$i][2] * $iResizeFaktor), _
    16 + $iZeroPointY + Floor($aAllScreenswithDimensions[$i][3] * $iResizeFaktor), _
    Floor($aAllScreenswithDimensions[$i][0] * $iResizeFaktor), _
    Floor($aAllScreenswithDimensions[$i][1] * $iResizeFaktor), _
    BitOR($SS_CENTER,$SS_CENTERIMAGE,$WS_BORDER))
    GUICtrlSetFont($LabelMonitors[$i], 14, 800, 0, "Courier New")
    GUICtrlSetBkColor($LabelMonitors[$i], 0xffffff)
    ; $aUseableMonitorMargins[x][0] = Left Margin
    ; $aUseableMonitorMargins[x][1] = Right Margin
    ; $aUseableMonitorMargins[x][2] = Top Margin
    ; $aUseableMonitorMargins[x][3] = Bottom Margin
    If $bShowMargins = True Then
    ; links Button setzen bei Bedarf
    If $aUseableMonitorMargins[$i][0] = True Then
    $ButtonMargins[$j] = GUICtrlCreateButton("", 16 + $iZeroPointX + Floor($aAllScreenswithDimensions[$i][2] * $iResizeFaktor), _
    16 + $iZeroPointY + Floor($aAllScreenswithDimensions[$i][3] * $iResizeFaktor), _
    12, _
    Floor($aAllScreenswithDimensions[$i][1] * $iResizeFaktor))
    GUICtrlSetBkColor($ButtonMargins[$j], 0x00ff00)
    $j = $j + 1
    EndIf
    ; rechts Button setzen bei Bedarf
    If $aUseableMonitorMargins[$i][1] = True Then
    $ButtonMargins[$j] = GUICtrlCreateButton("", 4 + $iZeroPointX + Floor(($aAllScreenswithDimensions[$i][2] + $aAllScreenswithDimensions[$i][0]) * $iResizeFaktor), _
    16 + $iZeroPointY + Floor($aAllScreenswithDimensions[$i][3] * $iResizeFaktor), _
    12, _
    Floor($aAllScreenswithDimensions[$i][1] * $iResizeFaktor))
    GUICtrlSetBkColor($ButtonMargins[$j], 0x00ff00)
    $j = $j + 1
    EndIf
    ; oben setzen bei Bedarf
    If $aUseableMonitorMargins[$i][2] = True Then
    $ButtonMargins[$j] = GUICtrlCreateButton("", 16 + $iZeroPointX + Floor($aAllScreenswithDimensions[$i][2] * $iResizeFaktor), _
    16 + $iZeroPointY + Floor($aAllScreenswithDimensions[$i][3] * $iResizeFaktor), _
    Floor($aAllScreenswithDimensions[$i][0] * $iResizeFaktor), _
    12)
    GUICtrlSetBkColor($ButtonMargins[$j], 0x00ff00)
    $j = $j + 1
    EndIf
    ; unten setzen bei Bedarf
    If $aUseableMonitorMargins[$i][3] = True Then
    $ButtonMargins[$j] = GUICtrlCreateButton("", 16 + $iZeroPointX + Floor($aAllScreenswithDimensions[$i][2] * $iResizeFaktor), _
    4 + $iZeroPointY + Floor(($aAllScreenswithDimensions[$i][3] + $aAllScreenswithDimensions[$i][1]) * $iResizeFaktor), _
    Floor($aAllScreenswithDimensions[$i][0] * $iResizeFaktor), _
    12)
    GUICtrlSetBkColor($ButtonMargins[$j], 0x00ff00)
    $j = $j + 1
    EndIf
    EndIf
    Next
    EndFunc

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

    ;Findet heraus welcher Monitor mit welcher Seite an welchen anderen Monitor stößt
    ; True = Seite Frei
    ; False = Da ist ein anderer Monitor
    ; $aUseableMonitorMargins[x][0] = Left Margin
    ; $aUseableMonitorMargins[x][1] = Right Margin
    ; $aUseableMonitorMargins[x][2] = Top Margin
    ; $aUseableMonitorMargins[x][3] = Bottom Margin
    Func _GetMonitorMargins()
    ; Alles auf True setzen (=Seite ist frei)
    For $i = 1 To $aAllScreenswithDimensions[0][0]
    For $j = 0 To 3
    $aUseableMonitorMargins[$i][$j] = True
    Next
    Next
    ;Jetzt die auf False setzen die an einen anderen Monitor stoßen (Testen immer 10 Pixel in die Richtung, daher +/- 10)
    ;Wir prüfen vom Mittelpunkt einen Monitors mit +/- 200 Pixel Toleranz nach oben/unten oder links/rechts
    For $i = 1 To $aAllScreenswithDimensions[0][0]
    For $j = 1 To $aAllScreenswithDimensions[0][0]
    If $i <> $j Then ; gegen sich selbst müssen wir nicht prüfen
    ; Horizontale Prüfungen - ausgehend von der vertikalen Mitte ( /2 ) , Toleranz 200 Pixel nach oben oder unten ( + oder - 200)
    If $aAllScreenswithDimensions[$i][3] < ($aAllScreenswithDimensions[$j][3] + ($aAllScreenswithDimensions[$j][1] / 2) - 200) And _
    ($aAllScreenswithDimensions[$i][3] + $aAllScreenswithDimensions[$i][1]) > ($aAllScreenswithDimensions[$j][3] + ($aAllScreenswithDimensions[$j][1] / 2) + 200) Then
    ; Ist neben dem linken Rand etwas?
    If ($aAllScreenswithDimensions[$i][2] - 10) < ($aAllScreenswithDimensions[$j][2] + $aAllScreenswithDimensions[$j][0]) And _
    ($aAllScreenswithDimensions[$i][2] - 10) > $aAllScreenswithDimensions[$j][2] Then
    $aUseableMonitorMargins[$i][0] = False
    $aUseableMonitorMargins[$j][1] = False
    EndIf
    ; Ist neben dem rechten Rand etwas?
    If ($aAllScreenswithDimensions[$i][2] + $aAllScreenswithDimensions[$i][0] + 10) > $aAllScreenswithDimensions[$j][2] And _
    ($aAllScreenswithDimensions[$i][2] + $aAllScreenswithDimensions[$i][0] + 10) < ($aAllScreenswithDimensions[$j][2] + $aAllScreenswithDimensions[$j][0]) Then
    $aUseableMonitorMargins[$i][1] = False
    $aUseableMonitorMargins[$j][0] = False
    EndIf
    EndIf
    ; Vertikale Prüfungen - ausgehend von der horizontalen Mitte ( /2), Toleranz 200 Pixel nach links oder rechts ( + oder - 200)
    If $aAllScreenswithDimensions[$i][2] < ($aAllScreenswithDimensions[$j][2] + ($aAllScreenswithDimensions[$j][0] / 2) - 200) And _
    ($aAllScreenswithDimensions[$i][2] + $aAllScreenswithDimensions[$i][0]) > ($aAllScreenswithDimensions[$j][2] + ($aAllScreenswithDimensions[$j][0] / 2) + 200) Then
    ; Ist oben etwas?
    If ($aAllScreenswithDimensions[$i][3] - 10) < ($aAllScreenswithDimensions[$j][3] + $aAllScreenswithDimensions[$j][1]) And _
    ($aAllScreenswithDimensions[$i][3] - 10) > $aAllScreenswithDimensions[$j][3] Then
    $aUseableMonitorMargins[$i][2] = False
    $aUseableMonitorMargins[$j][3] = False
    EndIf
    ; Ist unten etwas?
    If ($aAllScreenswithDimensions[$i][3] + $aAllScreenswithDimensions[$i][1] + 10) > $aAllScreenswithDimensions[$j][3] And _
    ($aAllScreenswithDimensions[$i][3] + $aAllScreenswithDimensions[$i][1] + 10) < ($aAllScreenswithDimensions[$j][3] + $aAllScreenswithDimensions[$j][1]) Then
    $aUseableMonitorMargins[$i][3] = False
    $aUseableMonitorMargins[$j][2] = False
    EndIf
    EndIf
    EndIf
    Next
    Next
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _GetMonitors
    ; Description ...:
    ; Syntax ........: _GetMonitors()
    ; Parameters ....:
    ; Return values .: Array[0][0] with number of Monitors,
    ; Array[x][0] Monitor X Screen wide
    ; Array[x][1] Monitor X Screen height
    ; Array[x][2] Monitor X Screen Position X
    ; Array[x][3] Monitor X Screen Position Y
    ; Author ........: AspirinJunkie
    ; Modified ......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........: https://autoit.de/index.php?page…1717#post101717
    ; Example .......: No
    ; ===============================================================================================================================
    Func _GetMonitors()
    Local $cbMonitorEnumProc = DllCallbackRegister("MonitorEnumProc", "ubyte", "ptr;ptr;ptr;int")
    If @error Then Return SetError(1, 0, False)
    Local $strctCount = DllStructCreate("uint Count;uint Width[12];uint Height[12];int left[12];int top[12]")
    If @error Then Return SetError(2, @error, False)
    Local $iCount

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

    DllStructSetData($strctCount, "Count", 0)

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

    $Ret = DllCall("User32.dll", "ubyte","EnumDisplayMonitors","ptr", 0,"ptr", 0, "ptr", DllCallbackGetPtr($cbMonitorEnumProc), "ptr", DllStructGetPtr($strctCount))
    If @error Or $Ret[0] = 0 Then Return SetError(3, @error, False)

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

    DllCallbackFree($cbMonitorEnumProc)

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

    $iCount = Int(DllStructGetData($strctCount, "Count"))

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

    Local $aMonitors[$iCount+1][4] = [[$iCount]]

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

    For $i = 1 To $iCount
    $aMonitors[$i][0] = Int(DllStructGetData($strctCount, "Width",$i))
    $aMonitors[$i][1] = Int(DllStructGetData($strctCount, "Height",$i))
    $aMonitors[$i][2] = Int(DllStructGetData($strctCount, "left",$i))
    $aMonitors[$i][3] = Int(DllStructGetData($strctCount, "top",$i))
    Next

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

    Return $aMonitors
    EndFunc
    Func MonitorEnumProc($hMonitor, $hdcMonitor, $lprcMonitor, $dwData)
    Local $strctRECT = DllStructCreate("long left;long top;long right;long bottom", $lprcMonitor)
    Local $strctCount = DllStructCreate("uint Count;uint Width[12];uint Height[12];int left[12];int top[12]", $dwData)
    Local $iNumber = DllStructGetData($strctCount, "Count")
    Local $Height = Int(DllStructGetData($strctRECT, "bottom"))-Int(DllStructGetData($strctRECT, "top"))
    Local $Width = Int(DllStructGetData($strctRECT, "right"))-Int(DllStructGetData($strctRECT, "left"))

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

    DllStructSetData($strctCount, "Width", $Width, $iNumber+1)
    DllStructSetData($strctCount, "Height", $Height, $iNumber+1)
    DllStructSetData($strctCount, "left", Int(DllStructGetData($strctRECT, "left")), $iNumber+1)
    DllStructSetData($strctCount, "top", Int(DllStructGetData($strctRECT, "top")), $iNumber+1)
    DllStructSetData($strctCount, "Count", $iNumber+1)
    Return True
    EndFunc
    ; ===============================================================================================================================

    [/autoit]

    Für die Darstellung über Labels habe ich mich entschieden weil ich so Text und Box in einem Objekt habe,
    die Ränder werden mit Buutons dargestellt im Vorgiff auf ein Benutzer-Setup was ich damit realisieren möchte.

    Wie immer freue ich mich auf eure Verbesserungsvorschläge :!:

    BLinz

    Dateien

    DisplayMonitorConfiguration.au3 16,78 kB – 408 Downloads
  • _FileListToArray mit nur datein die mit _small.jpg enden auflissten

    • BLinz
    • 2. Dezember 2011 um 21:31
    Zitat von AspirinJunkie

    Warum geht ihr über StringInStr/StringRight anstatt gleich das Pattern in FileListToArray einzutragen?:


    Weil die Lösung:

    • Zu Offentsichtlich und
    • Zu einfach ist ....

    Ach, man sieht manchmal den Wald vor lauter Bäumen nicht :wacko:

  • Buffalo Link-Station

    • BLinz
    • 2. Dezember 2011 um 21:04
    Zitat von Alina

    Wie flashe ich denn was gescheites auf die Linkstation? Abere bitte so, das die Daten nicht verloren gehen, denn es sind fast 2 GB Daten bereits drauf.


    Wenn die Daten so wichtg sind solltest du diese auf jeden fall vorher herunter kopieren - beim flashen kann immer etwas schief gehen (und wenn es nur ein Stromausfall ist (oder selbst ans Kabel kommt wie es mir schon einmal passiert ist))

    Und wenn es nur über FTP ist oder einen Rechner mit XP drauf. 2GB ist ja nicht die Welt

  • Werte in die Registratur aus einer *.ini schreiben

    • BLinz
    • 2. Dezember 2011 um 14:19

    Kürzer (und schneller) ist es wenn du bei solchen "Massenentscheidungen" Select oder Switch nimmst:

    Spoiler anzeigen
    [autoit]

    $datei = FileOpen("test.txt",10)
    For $i = 1 to 100
    $var = RegEnumVal("HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main", $i)
    $b = RegRead ( "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main", $var)
    Switch @EXTENDED
    Case 0
    $c = "REG_NONE"
    Case 1
    $c = "REG_SZ"
    Case 2
    $c = "REG_EXPAND_SZ"
    Case 3
    $c = "REG_BINARY"
    Case 4
    $c = "REG_DWORD"
    Case 5
    $c = "REG_DWORD_BIG_ENDIAN"
    Case 6
    $c = "REG_LINK"
    Case 7
    $c = "REG_MULTI_SZ"
    Case 8
    $c = "REG_RESOURCE_LIST"
    Case 9
    $c = "REG_FULL_RESOURCE_DESCRIPTOR"
    Case 10
    $c = "REG_RESOURCE_REQUIREMENTS_LIST"
    EndSwitch
    FileWrite($datei,"[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main]" & @CRLF & "Name = " & $var & ";" & " Type = " & $c & "; " & "Wert = " & $b & @CRLF)
    If @error <> 0 Then ExitLoop
    Next
    FileClose($datei)

    [/autoit]

    Schreibt sich meist auch leichter

  • Werte in die Registratur aus einer *.ini schreiben

    • BLinz
    • 2. Dezember 2011 um 14:08

    Nachtrag: Die ganz schnelle Lösung ist, den Import / Export auszulagern:

    http://www.winfaq.de/faq_html/Conte…p?h=tip2045.htm

    Regedit kann auch per Kommandozeile expotieren und Importieren

  • Werte in die Registratur aus einer *.ini schreiben

    • BLinz
    • 2. Dezember 2011 um 14:07

    Du musst dir halt beim auslesen die Typen mit merken und speichern,

    Wenn du mal in die Hilfe schaust zu RegRead wirst du sehen das er in @EXTENDED den Typ zurückgibt,

    [autoit]

    ; Reg Value type Constants
    Global Const $REG_NONE = 0
    Global Const $REG_SZ = 1
    Global Const $REG_EXPAND_SZ = 2
    Global Const $REG_BINARY = 3
    Global Const $REG_DWORD = 4
    Global Const $REG_DWORD_BIG_ENDIAN = 5
    Global Const $REG_LINK = 6
    Global Const $REG_MULTI_SZ = 7
    Global Const $REG_RESOURCE_LIST = 8
    Global Const $REG_FULL_RESOURCE_DESCRIPTOR = 9
    Global Const $REG_RESOURCE_REQUIREMENTS_LIST = 10

    [/autoit]
  • _FileListToArray mit nur datein die mit _small.jpg enden auflissten

    • BLinz
    • 2. Dezember 2011 um 10:41

    Was ist denn daran unschön?

    Eventuell würde ich StringRight statt StringInString nehmen:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>
    $folders = _FileListToArray(@ScriptDir,"*",2)

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

    For $t = 1 to $folders[0]
    $files=_FileListToArray(@ScriptDir&"\"&$folders[$t]&"\","*.jpg")
    For $I = 1 to UBound($files) -1
    if StringRight($files[$I],10) = "_small.jpg") then FileDelete(@ScriptDir&"\"&$folders[$t]&"\"&$files[$I])
    Next
    Next

    [/autoit]

    Deine Lösung würde auch Dateien löschen die "IchBin_small.jpgunddochsogross.bmp" heissen

  • Ini-Upload im Forum erlauben

    • BLinz
    • 2. Dezember 2011 um 10:35

    :rock: Glückwunsch zur Beförderung!

  • WinActive und HotKeySet wollen nicht so richtig

    • BLinz
    • 2. Dezember 2011 um 10:33

    Ähm,

    wäre es nicht einfach mit der Option $BS_DEFPUSHBUTTON bei dem Button der gedrückt werden soll?

    Aus der Hilfe:

    Zitat

    $BS_DEFPUSHBUTTON - Erstellt einen "Push"-Button mit einem dicken schwarzen Rand. Falls sich der Button in einer Dialogbox befindet, kann der Benutzer den Button durch Drücken der ENTER-Taste auswählen, auch wenn der Button nicht den Eingabefokus besitzt. Dieser Stil ist hilfreich für das Aktivieren des Standards oder der meist verwendeten Option.

    Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=C:\_AutoIT\HotKey Setup\Form2.kxf
    $Form2 = GUICreate("Form2", 405, 294, 302, 218)
    $Button1 = GUICtrlCreateButton("Dieser bei Enter / Return", 56, 200, 313, 57, $BS_DEFPUSHBUTTON)
    $Input1 = GUICtrlCreateInput("Gibe Text ein!", 72, 80, 281, 21)
    $Button2 = GUICtrlCreateButton("Dieser nur bei Mausklick", 64, 128, 187, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    MsgBox(0,"","Du hast Enter gedrückt!")
    Case $Input1
    Case $Button2
    MsgBox(0,"","Buttonb per Mausklick")
    EndSwitch
    WEnd

    [/autoit]

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™