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

  • Virtuelles (partielles) Laufwerk Erstellen/Löschen

    • BugFix
    • 26. Dezember 2008 um 23:51

    Hi,
    hiermit lassen sich Ordner-Pfade zu Virtuellen Laufwerken verknüpfen. Die so erstellten Laufwerke werden nicht in der Registry verewigt und sind nur für die Dauer der Sitzung gültig. Nach einem Neustart ist wieder alles 'normal'.

    Edit 27.12.08:
    Hab das noch etwas erweitert:
    - Standardmäßig wird jetzt der erste freie Laufwerksbuchstabe verwendet
    - der Verknüpfungspfad ist jetzt vorbelegt mit '@MyDocumentsDir' ( aber nur, weil ich die Parameterreihenfolge nicht ändern wollte :D )
    - bei Erfolg wird der Buchstabe des erstellten od. gelöschten Laufwerks zurückgegeben.

    Edit 28.12.08:
    Die Prüfung auf Existenz der Lw mit FileExists() funktioniert nicht bei leeren CD/DVD-Lw. Dadurch konnte bei Verknüpfung ohne Lw-Angabe dem CD-Lw der Buchstabe 'geklaut' werden :D. Habe den Abfragemodus geändert und auch die empfohlenen Änderungen von progandy und Oscar eingebunden - Dank an Euch.

    Edit 28.12.08 #2
    Dank eurer Hinweise wird die Funktion immer professioneller ;)
    Habe jetzt eingefügt, dass zum Löschen nicht mehr der Pfad angegeben werden muss. Den sucht sich die Funktion jetzt selbst raus.
    Zum Löschen reicht nun: _PartialDrive([Lw:], -1, 1)

    Edit 29.12.08
    Für all jene, die nicht nur vergessen haben, mit welchem Pfad verknüpft wurde, sondern auch welches Lw ertsellt wurde, habe ich noch eine Zusatzfunktion erstellt, die (sofern vorhanden) alle partiellen Laufwerke mit Lw-Buchstaben und verknüpftem Pfad als 2D-Array [Lw][Pfad] ausgibt. ;)
    Das ließe sich natürlich auch noch mit in die erste Funktion integrieren (z.B. mit Lw-Parameter '0' als erste Abfrage in der Func).

    _PartialDrive()
    [autoit]

    ; 'c:\test' als Laufwerk 'Q:'erstellen
    If _PartialDrive('Q:', 'c:\test') Then
    MsgBox(0, '', 'Partielles Laufwerk erstellt.')
    Else
    MsgBox(0, '', 'Erstellung Partielles Laufwerk fehlgeschlagen.')
    EndIf

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

    ; Laufwerk 'Q:' wieder löschen
    If _PartialDrive('Q:', -1, 1) Then
    MsgBox(0, '', 'Partielles Laufwerk gelöscht.')
    Else
    MsgBox(0, '', 'Löschen Partielles Laufwerk fehlgeschlagen.')
    EndIf

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

    ; Verknüpfung mit 'Eigene Dateien' auf erstes freies Laufwerk
    Local $newDrive = _PartialDrive()
    If Not @error Then
    MsgBox(0, '', 'Neues Laufwerk: ' & $newDrive)
    Else
    MsgBox(0, '', 'Fehler')
    EndIf

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

    ; Verknüpfung mit 'Eigene Dateien' wieder löschen
    _PartialDrive($newDrive, -1, 1)
    If Not @error Then
    MsgBox(0, '', 'Laufwerk gelöscht: ' & $newDrive)
    Else
    MsgBox(0, '', 'Fehler')
    EndIf

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

    ;==================================================================================================
    ; Function Name: _PartialDrive($sDeviceName=-1, $sTargetPath=-1, $iDelete=0)
    ; Description:: Erstellt od. löscht ein Virtuelles Laufwerk. Das Laufwerk wird
    ; beim Herunterfahren des PC automatisch gelöscht.
    ; Parameter(s): $sDeviceName Buchstabe des zu erstellenden/löschenden Laufwerks
    ; -1 erster freier Lw-Buchstabe (Standard)
    ; $sTargetPath Verknüpfungspfad, -1= Erstellen: @MyDocumentsDir (Standard)
    ; Löschen: der mit dem Laufwerk verknüpfte Pfad wird automatisch zugeordnet
    ; optional: $iDelete 0=Erstellen (Standard); 1=Löschen des Laufwerks
    ; Return Value(s): Erfolg Lw-Buchstabe des erstellten/gelöschten Laufwerks
    ; Fehler 0 @error=1 übergebener Lw-Buchstabe existiert bereits (nur Erstellen)
    ; @error=2 kein freier Lw-Buchstabe vorhanden (nur Erstellen)
    ; @error=3 kein gültiger Verknüpfungspfad
    ; @error=4 Aktion fehlgeschlagen
    ; @error=5 kein gültiges Lw zum Löschen angegeben
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _PartialDrive($sDeviceName=-1, $sTargetPath=-1, $iDelete=0)
    If $sDeviceName = -1 And $iDelete = 0 Then
    Local $aDrives = DriveGetDrive("ALL")
    Local $oDrives = ObjCreate("System.Collections.ArrayList")
    For $i = 1 To UBound($aDrives) -1
    $oDrives.Add(Asc(StringLeft($aDrives[$i],1)))
    Next
    Local $j = 100
    While $oDrives.Contains($j)
    $j += 1
    If $j > 122 Then Return SetError(2,0,0)
    WEnd
    $sDeviceName = Chr($j) & ':'
    ElseIf ($sDeviceName = -1 Or Not FileExists($sDeviceName)) And $iDelete = 1 Then
    Return SetError(5,0,0)
    ElseIf $sTargetPath = -1 And $iDelete = 1 Then
    Local $ret = DllCall("kernel32.dll", "long", "QueryDosDeviceA", "str", $sDeviceName, "str", "", "long", 260)
    If $ret[0] = 0 Then
    Return SetError(4,0,0)
    Else
    $sTargetPath = StringRegExpReplace($ret[2], '(\W*)([a-zA-Z].*)', '$2')
    EndIf
    EndIf
    $sDeviceName = StringRegExpReplace(StringLower($sDeviceName), '(.*)([a-z]{1}:)(.*)', '$2')
    If $iDelete = 0 And FileExists($sDeviceName) Then Return SetError(1,0,0)
    If $sTargetPath = -1 Then $sTargetPath = @MyDocumentsDir
    If Not FileExists($sTargetPath) Then Return SetError(3,0,0)
    Local $iFlag = 0x0
    If $iDelete <> 0 Then $iFlag = 0x2
    Local $ret = DllCall('kernel32.dll', 'long', 'DefineDosDeviceA', _
    'long', $iFlag, 'str', $sDeviceName, 'str', $sTargetPath)
    If $ret[0] = 0 Then
    Return SetError(4,0,0)
    Else
    Return $sDeviceName
    EndIf
    EndFunc ;==>PartialDrive

    [/autoit]
    _PartialDriveGet()
    [autoit]

    #include<array.au3>
    $a = _PartialDriveGet()
    _ArrayDisplay($a)

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

    ;===============================================================================
    ; Function Name: _PartialDriveGet()
    ; Description:: Ermittelt partiell erstellte Laufwerke
    ; Return Value(s): 2D-Array mit (sofern vorhanden) Lw-Buchstabe und Verknüpfungspfad
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _PartialDriveGet()
    Local $aFixed = DriveGetDrive('FIXED')
    Local $aOut[1][2] = [['Lw','Pfad']]
    For $i = 1 To UBound($aFixed) -1
    Local $ret = DllCall("kernel32.dll", "long", "QueryDosDeviceA", "str", $aFixed[$i], "str", "", "long", 260)
    Local $path = StringRegExpReplace($ret[2], '(\W*)([a-zA-Z].*)', '$2')
    If StringRegExp($path, '[a-zA-Z]:.*') Then
    ReDim $aOut[UBound($aOut)+1][2]
    $aOut[UBound($aOut)-1][0] = $aFixed[$i]
    $aOut[UBound($aOut)-1][1] = $path
    EndIf
    Next
    Return $aOut
    EndFunc ;==>_PartialDriveGet

    [/autoit]
  • Welche Lösung nehmen???

    • BugFix
    • 26. Dezember 2008 um 14:35
    Zitat von Mario2323

    das mit switch ist mir zu unsicher


    Was soll das denn bedeuten ??
    Der Unterschied ist folgender:
    - Switch: Werte einer Variable werden ausgewertet
    - Select: Werte unterschiedlicher Variablen werden ausgewertet
    Wenn du nur eine Variable hast (wie hier $msg) ist also Switch effektiver, da schneller.
    Und nun erklär mal, was dadran 'unsicher' ist. :huh:

  • Feiertagsberechnung

    • BugFix
    • 26. Dezember 2008 um 13:58
    Zitat von Padmak

    über weiterverwendung hab ich noch nicht nachgedacht^^


    Daraus ist das entstanden: Ewiger Kalender - Feiertage ;)

  • Combobox mit Scrollbar

    • BugFix
    • 26. Dezember 2008 um 13:53

    Wo willst du eine Scrollbar haben? - Vielleicht so:

    [autoit]

    $gui = GUICreate('test')
    $combo = GUICtrlCreateCombo('eins', 10, 10, 90, 120, $WS_VSCROLL)
    GUICtrlSetData(-1, 'zwei|drei|vier|fünf|sechs|sieben|acht|neun|zehn')
    GUISetState()

    Do
    $msg = GUIGetMsg()
    Until $msg = $GUI_EVENT_CLOSE

    [/autoit]
  • Laufwerks buchstaben ändern

    • BugFix
    • 26. Dezember 2008 um 10:26

    Dieser Code wird NUR von Windows 2003 Server unterstützt (evtl. auch höhere Serverversion), aber nicht von 2K, XP etc.

  • Welche Lösung nehmen???

    • BugFix
    • 26. Dezember 2008 um 10:12

    Falls ich mit GUIGetMsg arbeite, bevorzuge ich eine fußgesteuerte Schleife, denn ein Schleifeneintritt ist ja erwünscht/notwendig um überhaupt den Wert für die Abbruchbedingung erhalten zu können.

    [autoit]

    Do
    $msg = GUIGetMsg()
    Switch $msg
    Case $ctrl
    ; ...
    ;..
    EndSwitch
    Until $msg = $GUI_EVENT_CLOSE

    [/autoit]
  • UDF: Timestamp2array

    • BugFix
    • 26. Dezember 2008 um 09:51

    Hatte mal etwas ähnliches erstellt: extended TimerDiff()

  • "Schwebende" Button - Skriptbeispiel

    • BugFix
    • 25. Dezember 2008 um 13:23

    @Raupi: Du hast völlig recht - die Zeilen kannst du streichen, das hatte ich vergessen. Sie werden nur benötigt, wenn man Titelleiste und äußere Region in der GUI hat. Da das hier nicht der Fall ist, können sie entfernt werden.

  • "Schwebende" Button - Skriptbeispiel

    • BugFix
    • 24. Dezember 2008 um 18:34

    Hi,
    ich hab gerade die neue Version 3.3.0.0 angeschaut und fand ein Winapi-Skript ganz interessant. Ich habe das Bsp. mal etwas entschlackt und leicht verändert.
    Ergebnis ist eine nicht sichbare GUI - nur die Button werden angezeigt. Das Skript ist jetzt für GUI mit POPUP-Style angepaßt. Soll die Titelleiste angezeigt werden, müssen die Parts für die Systemmetrics wieder integriert werden (s. Bsp. bei _WinAPI_CreateRoundRectRgn).

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <WinAPI.au3>

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

    Global $aButton[5]

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

    $gui = GUICreate("Test Windows regions", 150, 150, @DesktopWidth-170, -1, $WS_POPUP, $WS_EX_TOPMOST)
    $aButton[0] = GUICtrlCreateButton("Button 1", 0, 0, 150)
    $aButton[1] = GUICtrlCreateButton("Button 2", 0, 30, 150)
    $aButton[2] = GUICtrlCreateButton("Button 3", 0, 60, 150)
    $aButton[3] = GUICtrlCreateButton("Button 4", 0, 90, 150)
    $aButton[4] = GUICtrlCreateButton("Exit", 0, 120, 150)
    GUISetState(@SW_SHOW)

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

    $pos = WinGetPos($gui)
    _GuiHole($gui, 0, 0, 150, 150)

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $aButton[4]
    ExitLoop
    Case $aButton[0]
    MsgBox(0, '', 'Button1 geklickt')
    Case $aButton[1]
    MsgBox(0, '', 'Button2 geklickt')
    Case $aButton[2]
    MsgBox(0, '', 'Button3 geklickt')
    Case $aButton[3]
    MsgBox(0, '', 'Button4 geklickt')
    EndSwitch
    WEnd

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

    Func _GuiHole($h_win, $i_x, $i_y, $i_sizew, $i_sizeh)
    Local $outer_rgn, $inner_rgn, $combined_rgn
    $combined_rgn = _WinAPI_CreateRectRgn(0, 0, 0, 0)
    _WinAPI_DeleteObject($outer_rgn)
    _WinAPI_DeleteObject($inner_rgn)
    _AddCtrlRegion($combined_rgn, $aButton)
    _WinAPI_SetWindowRgn($h_win, $combined_rgn)
    EndFunc ;==>_GuiHole

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

    Func _AddCtrlRegion($full_rgn, $ctrl_id)
    Local $ctrl_pos, $ctrl_rgn
    If IsArray($ctrl_id) Then
    For $i = 0 To UBound($ctrl_id) -1
    $ctrl_pos = ControlGetPos($gui, "", $ctrl_id[$i])
    $ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0], $ctrl_pos[1], $ctrl_pos[0] + $ctrl_pos[2], $ctrl_pos[1] + $ctrl_pos[3])
    _WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR)
    _WinAPI_DeleteObject($ctrl_rgn)
    Next
    Else
    $ctrl_pos = ControlGetPos($gui, "", $ctrl_id)
    $ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0], $ctrl_pos[1], $ctrl_pos[0] + $ctrl_pos[2], $ctrl_pos[1] + $ctrl_pos[3])
    _WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR)
    _WinAPI_DeleteObject($ctrl_rgn)
    EndIf
    EndFunc ;==>_AddCtrlRegion

    [/autoit]
  • dllcall

    • BugFix
    • 21. Dezember 2008 um 18:52

    Hab ich dir doch reinkopiert.

  • dllcall

    • BugFix
    • 21. Dezember 2008 um 18:17

    Falsche und ungenügende Parameter:

    Zitat

    Declare Function LockFile Lib "kernel32.dll" Alias "LockFile" (ByVal hFile As DWord, ByVal dwFileOffsetLow As DWord, ByVal dwFileOffsetHigh As DWord, ByVal nNumberOfBytesToLockLow As Long, ByVal nNumberOfBytesToLockHigh As Long) As Long

  • Aktuellen Cursor rausfinden...

    • BugFix
    • 21. Dezember 2008 um 17:37

    Das geht dann so:

    [autoit]

    $hWaitCurs = _LoadCursorFromFile(@WindowsDir & "\cursors\cross.cur")
    If _SetSystemCursor($hWaitCurs, $OCR_IBEAM) Then MsgBox(0, '', 'Cursor gesetzt')

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

    Func _SetSystemCursor($hCur, $id)
    Local $ret = DllCall("user32.dll", "int" ,"SetSystemCursor","int",$hCur,"int",$id)
    Return $ret[0]
    EndFunc

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

    Func _LoadCursorFromFile($lpFileName)
    Local $ret = DllCall("user32", 'long', "LoadCursorFromFileA", 'str', $lpFileName)
    Return $ret[0]
    EndFunc

    [/autoit]
  • Aktuellen Cursor rausfinden...

    • BugFix
    • 21. Dezember 2008 um 14:24

    Ich hab grad nochmal deinen ersten Post gelesen - ist das Tool, von dem du sprichst, ein Autoitskript? Dann kannst du natürlich viel einfacher den Cursor setzen mit GUISetCursor und GUICtrlSetCursor

  • Aktuellen Cursor rausfinden...

    • BugFix
    • 21. Dezember 2008 um 13:59

    Du mußt den Cursorpfad angeben

    [autoit]

    @WindowsDir & '\Cursors\cross.cur'

    [/autoit]


    Und Kombinationen von Parametern immer mit BitOr($par1,$par2) und nicht $par1+$par2.

    Weiterhin solltest du das Handle des alten Cursors auffangen um ihn zurücksetzen zu können.

    [autoit]

    $hOldCursor = _WinAPI_SetCursor($cur)

    [/autoit]
  • Aktuellen Cursor rausfinden...

    • BugFix
    • 21. Dezember 2008 um 12:24

    Schau dir mal diese Funktionen an:

    [autoit]

    #Include <WinAPI.au3>
    _WinAPI_GetCursorInfo()
    _WinAPI_SetCursor($hCursor)

    [/autoit]
  • Programm unter WIndows öffnen c:/programme/... ? ShellExecute

    • BugFix
    • 21. Dezember 2008 um 10:40

    Wenn es Systemprogramme sind benötigst du keine Pfadangabe, für alle anderen schon. Existieren zum Programm z.B. INI-Dateien(od. andere Daten auf die das Prog zugreifen will) im Programmpfad, so ist auch das Arbeitsverzeichnis anzugeben.

    [autoit]

    ShellExecute ( "filename" [, "parameters" [, "workingdir" [, "verb" [, showflag]]]] )

    [/autoit]
  • Wenn man einen Button in der MsgBox drückt

    • BugFix
    • 21. Dezember 2008 um 10:35

    Eine angenehme Hilfe zur MsgBox findest du in Scite mit <Alt+W> oder auch hier: MsgBox - alle Parameter auf einen Blick

  • X/Y Koordinaten in Send Befehle

    • BugFix
    • 20. Dezember 2008 um 21:23
    Zitat von Keyle

    Was meinst du mit linear und nichtlinear ich kann mir darunter jetzt nichts vorstellen


    Linear heißt: 1 Pixel des Desktop entspricht zum Bsp. dem Wert 25 der von deinem Pad kommt, 2=50, 3=75, 4=100 etc.
    Nicht-Linear: 1=25, 2=70, 3=130 etc.

  • X/Y Koordinaten in Send Befehle

    • BugFix
    • 20. Dezember 2008 um 20:20

    Wie anno2008 schon richtig sagte sind mehr Koordinaten und vor allem deren Entsprechung auf dem Desktop notwendig.
    Es kann sein, dass deine Parameter linear oder auch nichtlinear sind. Du brauchst also auf jeden Fall Basiswerte für alle Desktopecken und die Mittelposition. Dann kann man erkennen, wie die Werte sich verhalten.

  • datei details

    • BugFix
    • 19. Dezember 2008 um 20:26

    Vielleicht hilft dir ja das: Erweiterte Dateiinfo (eine Datei od. alle eines Ordners)

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™