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

Beiträge von Bitnugger

  • Forenupdate - November 2018 - Probleme / Anregungen / Feedback - Sammelthread

    • Bitnugger
    • 18. November 2018 um 12:59

    Kann keine *.au3 mehr hochladen...

    Subclassing Example_2.au3 --> Die Datei hat eine ungültige Dateiendung.

  • Reguläre Ausdrücke Sammlung

    • Bitnugger
    • 17. November 2018 um 04:42
    Zitat von fakeraol

    Regular Expressions ist eine Sprache, ...

    Ne, ne, ne und ne... Deutsch, Englisch, AutoIt, Python und HTML sind Sprachen, aber Regular Expressions ist definitiv keine!

    Zitat von Wikipedia

    Ein regulärer Ausdruck (englisch regular expression, Abkürzung RegExp oder Regex) ist in der theoretischen Informatik eine Zeichenkette, die der Beschreibung von Mengen von Zeichenketten mit Hilfe bestimmter syntaktischer Regeln dient.

    Zitat von fakeraol

    Wer die Sprache nicht lernt, sondern nur fertige Ausdrücke kopiert, wird nie weiter kommen, genau wie "dumme" Maschinen, die auch immer nur das können, was ihnen jemand "beigebracht" hat.

    Das sehe ich anders. Wenn ich öfters weite Strecken überwinden muss, aber nicht die Lust, Zeit oder Möglichkeit habe, zu erlernen mir selbst ein Auto zu bauen, dann leihe/lease/kaufe ich mir eins. Das bringt mich auch ans Ziel!

    Zitat von fakeraol

    Das Sinnvollste wäre es wohl, die Erklärungen in der Hilfe hier zu diskutieren und entspr. Fragen von Laien ausführlicher zu erklären, incl. Beispielen.

    Nein, das finde ich gar nicht sinnvoll. Dieser Thread ist dafür da, um Reguläre Ausdrücke zu sammeln, nicht aber um ihn mit endlosen Diskussionen/Fragen zu füllen. Dafür gibt es hier sicher andere Threads oder Seiten im Internet, die einen zu diesem Thema erleuchten können.

  • Zeilen in Exceltabelle löschen

    • Bitnugger
    • 15. November 2018 um 21:04
    Zitat von autoiter

    _Excel_RangeRead($oWorkbook, Default, $c & ":" $z)

    _Excel_RangeRead($oWorkbook, Default, $c & ":" & $z)

  • FileLock und PID - durch welchen Prozess ist eine Datei gesperrt/geöffnet

    • Bitnugger
    • 15. November 2018 um 00:31
    Zitat von Mr.Fritz

    "schade", ich dachte (hatte gehofft) dass der Zugriff einfacher möglich ist...

    Hey, also noch einfacher als mit openfiles.exe geht es bald gar nicht!

    Hier mal kurz erklärt, wie das mit openfiles.exe funktioniert:

    Wichtig: openfiles.exe muss immer in einer Eingabeaufforderung mit erhöhten Rechten (als "Administrator") gestartet werden!

    Wenn lokale Dateien angezeigt/berücksichtigt werden sollen, musst openfiles.exe einmalig mit den Parametern /Local ON aufrufen und der PC dann neu gestartet werden.

    openfiles.exe /Local ON

    openfiles.exe kann nun einfach ohne Parameter aufrufen werden, wenn ein einfache Auflistung der geöffneten Pfade/Dateien reicht...

    das sieht dann so aus:

    Code
    Lokal geöffnete Dateien:
    ---------------------
    
    Kennu Prozessname          Open File (Pfad\ausführbare Datei)
    ===== ==================== ==================================================
    68    sihost.exe           C:\Windows\System32
    432   sihost.exe           C:\Windows\Registration\R000000000015.clb
    560   sihost.exe           C:\..4ccf1df_5.82.17763.134_none_10e1f93464306f65
    1776  sihost.exe           C:\..\Windows\System32\de-DE\KernelBase.dll.mui
    2736  sihost.exe           C:\..44ccf1df_1.1.17763.134_none_369e2a1f61b3942a
    64    GroupyCtrl.exe       C:\Windows\System32
    108   GroupyCtrl.exe       C:\..44ccf1df_1.1.17763.134_none_369e2a1f61b3942a
    ...
    Alles anzeigen

    ...oder aber (z.B.) mit den Parametern /Query /FO LIST /V, um einer erweiterte Ausgabe zu bekommen...

    das sieht dann so aus:

    Code
    Kennung:                            2564
    Zugriff durch:                      ghost
    PID:                                13684
    Prozessname:                        AutoIt3Help.exe
    Open File (Pfad\ausführbare Datei): C:\Windows\SysWOW64\stdole2.tlb
    
    Kennung:                            64
    Zugriff durch:                      ghost
    PID:                                10640
    Prozessname:                        smartscreen.exe
    Open File (Pfad\ausführbare Datei): C:\Windows\System32
    Alles anzeigen
    Zitat von Mr.Fritz

    Ich möchte für eine genau bestimmte Datei ermitteln, durch welchen Prozess diese "in use" ist.

    Du meinst... durch welche Prozesse - denn das können durchaus auch mehrere sein!

    Ich schreibe die Tage mal ein kleines Script dafür...

  • InetGet lädt keine große Dateien

    • Bitnugger
    • 13. November 2018 um 19:30
    Zitat von Tweaky

    Aber was genau bewirkt dies?

    Wird länger gewartet, wenn keine Rückmeldung kommt?

    Ja, es wird länger gewartet, wenn keine Rückmeldung kommt.

    Global $CONNECT_TIMEOUT = 0xFFFFFF, $RECEIVE_TIMEOUT = 0xFFFFFF

    Hier habe ich für CONNECT TIMEOUT und RECEIVE TIMEOUT die größtmöglichen Werte gesetzt. Für dich ist sicher $RECEIVE_TIMEOUT der wichtigere Wert.

    Du kannst die Werte ja mal schrittweise verringern - z.B.: 0x0FFFFF, 0x00FFFF, 0x000FFF.

    Zitat von Tweaky

    Hat diese Funktion Nachteile?

    In deinem Fall nein, aber ansonsten wäre es wohl extrem nervig, wenn man bei allen Verbindungen ewig lange auf eine Rückmeldung warten müsste und es am Ende dann doch nicht funktioniert.

    Die Änderungen gelten nur für das ausgeführte Script (oder das angegebene Internet-Handle) und auch nur solange dieses läuft.

  • Speicherabbild -Analyse

    • Bitnugger
    • 13. November 2018 um 15:27
    Zitat von Tuxedo

    Keine Veränderung wenn ich den Router vom Netzt genommen habe.

    Doch... aber das dauert ein paar Minuten, bis der veränderte Status erkannt wird.

  • Speicherabbild -Analyse

    • Bitnugger
    • 13. November 2018 um 15:00
    Zitat von fakeraol

    Global $file = FileOpen("connection.log")

    So kannst du aber nicht in die Datei schreiben, sondern nur lesen - du musst als zweiten Parameter den Mode angeben: $FO_APPEND (1) oder $FO_OVERWRITE (2)

    Global $file = FileOpen("connection.log", $FO_APPEND)

  • FileLock und PID - durch welchen Prozess ist eine Datei gesperrt/geöffnet

    • Bitnugger
    • 13. November 2018 um 13:03

    Schau mal hier: https://www.pcwelt.de/ratgeber/2-Ope…teln-93509.html

  • Shoutbox weg?

    • Bitnugger
    • 12. November 2018 um 22:28

    Als ich heute von der Arbeit kam, konnte ich autoit.de gar nicht erreichen, dann ging es eine Zeit lang... und nun ist die Shoutbox weg.

    Ist das jetzt nur bei mir der Fall?

  • Verschlüsselungssoftware

    • Bitnugger
    • 12. November 2018 um 21:57

    Übrigens: VeraCrypt ist ein Abspaltung von TrueCrypt, dass dessen bekannte Sicherheitslücken schließt und somit auch TrueCrypt-Container öffnen kann.

  • Speicherabbild -Analyse

    • Bitnugger
    • 12. November 2018 um 21:52
    Zitat von fakeraol

    $IsCon = DllCall($hDLL, 'long', 'IsInternetConnected')

    Zitat

    https://docs.microsoft.com/en-us/previous…ternetconnected

    Bemerkungen

    Diese API verwendet NCSI und den Network Location Manager (NLM), um eine "beste Einschätzung" hinsichtlich der Internetkonnektivität des aktuellen Benutzers zu ermitteln. Selbst wenn S_OK zurückgegeben wird, kann nicht garantiert werden, dass der Benutzer eine bestimmte Internetadresse erreichen kann.

    Hast du eine Fritz!Box?

    Wenn ja, dann hätte ich ein Script für dich, dass direkt die Fritz!Box (ohne Passwort) abfragen kann, ob sie mit dem Internet verbunden ist. Dazu benötigst du aber Python 3, weil die eigentliche Abfrage mit einem Python-Script erledigt wird.

  • InetGet lädt keine große Dateien

    • Bitnugger
    • 11. November 2018 um 19:02

    Evtl. hilft es, die Timeouts (CONNECT TIMEOUT und/oder RECEIVE TIMEOUT) zu ändern...

    Kannst ja mal dieses Script testen, ob es damit geht.

    AutoIt
    ;-- TIME_STAMP   2018-11-11 19:00:00   v 0.1
    
    Global Const $INTERNET_OPTION_CONNECT_TIMEOUT = 2, $INTERNET_OPTION_RECEIVE_TIMEOUT = 6
    Global $CONNECT_TIMEOUT = 0xFFFFFF, $RECEIVE_TIMEOUT = 0xFFFFFF
    
    _InternetSetOptionsW()
    
    ; ...hier dein Script
    ;~ InetGet(...)
    
    Func _InternetSetOptionsW()
        Local $hWININET = DllOpen("wininet.dll"), $hInternet = 0, $aRes, $tTime = DllStructCreate("long")
        DllStructSetData($tTime, 1, $CONNECT_TIMEOUT)
        $aRes = DllCall($hWININET, 'dword', 'InternetSetOptionW', 'int', $hInternet, 'dword', $INTERNET_OPTION_CONNECT_TIMEOUT, "ptr", DllStructGetPtr($tTime), "dword", DllStructGetSize($tTime))
        If @error Or $aRes[0] = 0 Then
            DllCall($hWININET, 'int', 'InternetCloseHandle', 'int', $hInternet)
            DllClose($hWININET)
            ConsoleWrite('! CONNECT_TIMEOUT konnte nicht geändert werden!' & @CRLF)
            Return SetError(1, 0, "")
        EndIf
        ConsoleWrite('+ CONNECT_TIMEOUT wurde geändert!' & @CRLF)
    
        DllStructSetData($tTime, 1, $RECEIVE_TIMEOUT)
        $aRes = DllCall($hWININET, 'int', 'InternetSetOptionW', 'int', $hInternet, 'dword', $INTERNET_OPTION_RECEIVE_TIMEOUT, "ptr", DllStructGetPtr($tTime), "dword", DllStructGetSize($tTime))
        If @error Or $aRes[0] = 0 Then
            DllCall($hWININET, 'int', 'InternetCloseHandle', 'int', $hInternet)
            DllClose($hWININET)
            ConsoleWrite('! RECEIVE_TIMEOUT konnte nicht geändert werden!' & @CRLF)
            Return SetError(1, 0, "")
        EndIf
        ConsoleWrite('+ RECEIVE_TIMEOUT wurde geändert!' & @CRLF)
    
        Return True
    EndFunc  ;==>__InternetSetOptionsW
    Alles anzeigen
  • Funktion "WinMove" funktioniert nicht im kompilierten Skript

    • Bitnugger
    • 11. November 2018 um 17:44

    Teste mal das hier...

    AutoIt
    ;-- TIME_STAMP   2018-11-11 17:42:09   v 0.1
    
    #NoTrayIcon
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=..\..\..\Icons\ACDSee9pro.ico
    #AutoIt3Wrapper_Res_Description=Open SpeedCommander
    #AutoIt3Wrapper_Res_Fileversion=1.0.0.35
    #AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
    #AutoIt3Wrapper_Res_Language=1031
    #AutoIt3Wrapper_AU3Check_Stop_OnWarning=y
    #AutoIt3Wrapper_Run_Tidy=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    
    Opt('WinTitleMatchMode', 2)
    
    _SpeedCommander_Start()
    
    Func _SpeedCommander_Start()
        If Not FileExists('C:\Program Files\SpeedProject\SpeedCommander 15\SpeedCommander.exe') Then
            Exit MsgBox(64, @ScriptFullPath, 'Das Programm "SpeedCommander 15 Pro" scheint' & @CRLF & 'auf diesem PC nicht installiert zu sein.')
        EndIf
        ; Pfade, die Leerzeichen enthalten, solltest du besser in Anführungszeichen übergeben! Hier in diesem Fall werden in $CMDLINE nämlich sonst 3 Parameter übergeben!
    ;~     Local $iPID = ShellExecute('SpeedCommander.exe', ' /L:C:\x_Alter_PC\Eigene Dateien /R:C:\x_Alter_PC', 'C:\Program Files\SpeedProject\SpeedCommander 15', 'open')
        ; $CMDLINE[1] = /L:C:\x_Alter_PC\Eigene
        ; $CMDLINE[2] = Dateien
        ; $CMDLINE[3] = /R:C:\x_Alter_PC
    
        ; Um ausführbare Dateien zu starten, würde ich Run() verwenden!
    ;~     Local $iPID = ShellExecute('SpeedCommander.exe', ' /L:"C:\x_Alter_PC\Eigene Dateien" /R:"C:\x_Alter_PC"', 'C:\Program Files\SpeedProject\SpeedCommander 15', 'open')
        Local $iPID = Run('SpeedCommander.exe /L:"C:\x_Alter_PC\Eigene Dateien" /R:"C:\x_Alter_PC"', 'C:\Program Files\SpeedProject\SpeedCommander 15')
        ConsoleWrite("$iPID                      --> " & $iPID & @CRLF)
        If Not $iPID Then Exit MsgBox(64, @ScriptFullPath, 'Fehler bei Run() - SpeedCommander 15 Pro konnte nicht gestartet werden!')
    
        Local $hWnd = WinWait('SpeedCommander 15 Pro', '', 10)
        ConsoleWrite("$hWnd                      --> " & $hWnd & @CRLF)
        If IsHWnd($hWnd) Then
            ConsoleWrite("@DesktopWidth > 1366?      --> " & @DesktopWidth & @CRLF)
            If @DesktopWidth > 1366 Then
                Local $iMove = 0, $hMove, $x = (@DesktopWidth / 2) - (1400 / 2), $y = ((@DesktopHeight / 2) - (900 / 2) + 70), $w = 1400, $h = 900
                Do
                    $hMove = WinMove($hWnd, '', $x, $y, $w, $h)
                    If IsHWnd($hMove) Then ExitLoop
                    $iMove += 1
                    Sleep(250)
                Until $iMove = 10
                ConsoleWrite("$iMove                     --> " & $iMove & @CRLF)
                If Not $hMove Then Exit MsgBox(64, @ScriptFullPath, 'Fenster von SpeedCommander 15 Pro konnte nicht verschoben werden!')
            EndIf
        Else
            Exit MsgBox(64, @ScriptFullPath, 'Sie haben evtl. nicht genug Rechte, um das Programm "SpeedCommander 15 Pro" zu starten?!')
        EndIf
    
        Return True
    EndFunc   ;==>_SpeedCommander_Start
    Alles anzeigen
  • Zeilen in Exceltabelle löschen

    • Bitnugger
    • 11. November 2018 um 15:15
    Zitat von Friedhelm39

    Hurra! Ich bin einen Schritt weiter.

    Diese Anweisung läuft:


    _Excel_RangeDelete($oExcelU.ActiveSheet,"A2:A3")

    Na super! :thumbup:

    Hier hast du nun auch einen korrekten Range angegeben... denn "1" ist kein korrekter Range... weil ein Range aus Start:Ende besteht, wobei Start und Ende auch identisch sein können.

    Zitat von Friedhelm39

    Zwei erhebliche Wissenslücken habe ich bei den Console-Anweisungen. Wo finde ich Stdout?

    https://de.wikipedia.org/wiki/Standard-Datenströme

    Stdout kannst du mit der Funktion StdoutRead auslesen, doch das ist momentan nicht relevant für dich. Das brauchst du nur, wenn du die Ausgaben aus dem STDOUT-Stream eines zuvor ausgeführten untergeordneten Prozesses lesen willst - wenn du z.B. mit AutoIt einen Consolen-Befehl mit Run() ausführst und dessen Ausgabe haben willst. Mehr zu diesem Thema findest du in der AutoIt-Hilfe unter folgenden Funktionen: Run, RunAs, StdoutRead, StderrRead, StdinWrite, StdioClose.

    Zitat von Friedhelm39

    Da greift evtl. die zweite Lücke. ich habe den Umstieg auf SciTE bisher nicht geschafft.

    Hier will ich direkt mal klar stellen, dass die Ausgabenkonsole von SciTE/NP++ eine spezielle Console (Scintilla-Control) ist, für die du im Normalfall kein Stdout bzw. StdoutRead brauchst.

    Schau dir in der AutoIt-Hilfe folgende Funktionen an: ConsoleWrite, ConsoleRead, ConsoleWriteError

    Du hast den Umstieg noch nicht geschafft? Wieso hast du mit NP++ angefangen, obwohl SciTE der empfohlenen Editor für AutoIt ist? Nein, sage es nicht... weil jeder sich so gut quält, wie er kann. 8o

    Wenn du AutoIt installierst, wird bereits ein abgespeckte Version von SciTE mit installiert. Um alle verfügbaren SciTE-Features nutzen zu können (wärmstens empfohlen!), musst du aber SciTE4AutoIt3 installieren.

    Hier der Link zum Download: https://www.autoitscript.com/site/autoit-sc…itor/downloads/

    Im Anhang findest du noch das test2.zip, das ist deine test1.zip... nur etwas aufgepeppt und mit einigen Kommentaren versehen. Schau es dir an!

    So, jetzt hast du erst mal genug zu lesen... ;)

    Dateien

    test2.zip 8,92 kB – 3 Downloads
  • Zeilen in Exceltabelle löschen

    • Bitnugger
    • 10. November 2018 um 10:41
    Zitat von Friedhelm39

    Wo findet man Beschreibungen von Anweisungen mit Punkterweiterungen wie z.B. "$oWorkbook.ActiveSheet"

    Generell: https://msdn.microsoft.com/

    Speziell zu Excel Workbook: https://msdn.microsoft.com/de-de/vba/exce…ok-object-excel

    Zitat von Friedhelm39

    Wie gebe ich Variable bei denExcel-Anweisungen an, vielleicht z.B. für eine zu löschende Zeile


    _Excel_RangeDelete($oWorkbook.ActiveSheet, $Zeile)

    Du kannst bei der Funktion _Excel_RangeDelete den Range so setzen, dass eben nur die gewünschte Zeile gelöscht wird.

    Bsp.: Nur Zeile 7 löschen

    AutoIt
    Local $vRange = '7:7' ; Der Bereich kann ein Bereichsobjekt sein, ein A1-Bereich (z.B. "A1:B2", "1:2" (Zeile 1 bis 2), "D:G" (Spalten D bis G) usw.).
    _Excel_RangeDelete($oWorkbook.ActiveSheet, $vRange) ; Löscht eine oder mehrere Zellen, Zeilen oder Spalten aus dem angegebenen Arbeitsblatt
  • Funktion "WinMove" funktioniert nicht im kompilierten Skript

    • Bitnugger
    • 9. November 2018 um 19:36
    Zitat von AutoItler

    Außerdem hätte ich gern noch gewußt, wie man den Code korrekt in einen Spoiler einfügt, sodass es so wie im Editor aussieht?

    Direkt links neben dem Spoiler-Tag findest du den Code-Tag in der Werkzeugleiste. Das wird dir aber auch angezeigt, wenn du mit der Maus über den Symbolen in der Werkzeugleiste stehst.

  • Zeilen in Exceltabelle löschen

    • Bitnugger
    • 9. November 2018 um 15:19
    Zitat von Friedhelm39

    Das Testscript ExcelDelete2.au3 habe ich derBeschreibung der Function _Excel_RangeDelete, -Beispie2- per cut and paste entnommen


    (https://www.autoitscript.com/a…ns/_Excel_RangeDelete.htm)

    und in I:\ABC\_0-b\AutoIt\Scripts\ExcelDelete gespeichert.

    Nicht per Cut & Paste, sondern per Copy & Paste!

    Das habe ich auch mal genau so gemacht... den Text aus der Zwischenablage in SciTE eingefügt und unter m:\Excel\_Excel_RangeDelete[2].au3 gespeichert. Die Excel-Testdatei habe ich hier m:\Excel\Extras\_Excel1.xls gespeichert. Wenn ich nun das Script in SciTE mit F5 ausführe, läuft alles wie es soll.

    In welches Programm/Editor hast du denn den Text mit Paste eingefügt, um ihn zu speichern?

    Zitat von Friedhelm39

    Hier die Zeile 8 vor und nach der Änderung:

    Die Zeilen unter vorher und nachher sind identisch!

    Zitat von Friedhelm39

    Als Test-Exceltabelle müßte man eine beliebige Exceldatei nehmen können.

    Das ist Quatsch... denn beliebig wäre demnach auch eine leere Exceldatei... und darin könntest du keine Zeilen löschen. Zudem wurde in diesem Beispiel eben genau diese Datei ausgewählt, um zu zeigen, wie man mehrere Zeilen in einem bestimmten Arbeitsblatt in einem Rutsch löscht.

  • Editbox nachträglich in TabControl verschieben

    • Bitnugger
    • 8. November 2018 um 23:26
    Zitat von Code-Jack

    Macht dieser Code Probleme, unter höheren Windows-Versionen?

    Nein, doch diese Frage solltest du dir eigentlich anhand meines vorherigen Beispiels selbst beantworten können, denn darin werden ja dieselben Funktionen benutzt und ich hatte ja geschrieben, das ich Win 7/10 benutze. 8o

    Diese Zeile kannst du dir sparen...

    _GUICtrlTab_DeselectAll($hGUIParent1, False) ; Remarks: This only works if $TCS_BUTTONS style flag has been set.

  • Editbox nachträglich in TabControl verschieben

    • Bitnugger
    • 8. November 2018 um 17:21
    Zitat von Code-Jack

    Gut dass Du darauf aufmerksam machst, dass da eventuell Probleme zu erwarten sind!

    Nein, keine Probleme, denn die Lösung ist recht simpel: Du musst die Message WM_DROPFILES selbst verarbeiten.

    So sieht das dann aus...

    AutoIt
    ;-- TIME_STAMP   2018-11-08 17:13:50   v 0.1
    
    #Region    ;************ Includes ************
    #Include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <GuiTab.au3>
    #include <WinAPISysWin.au3>
    #EndRegion ;************ Includes ************
    
    Example()
    
    Func Example()
        Local $hGUI, $idButton1, $idButton2, $idButton3, $idInput, $idNewInput, $aTabs[3], $sInput
    
        $hGUI = GUICreate("Parent1", 600, 400, -1, -1, -1, $WS_EX_ACCEPTFILES)
    
        $idButton1 = GUICtrlCreateButton("Move Inputbox in Tab 2", 350,  10, 200, 50)
        $idButton2 = GUICtrlCreateButton("Move Inputbox in Tab 1", 350,  70, 200, 50)
        $idButton3 = GUICtrlCreateButton("Create Inputbox in GUI", 350, 130, 200, 50)
    
        $aTabs[0] = GUICtrlCreateTab(10, 40, 300, 300)
        $aTabs[1] = GUICtrlCreateTabItem("tab1")
        $idInput = GUICtrlCreateInput("Ich möchte moven!", 50, 150, 200, 30, BitOR($GUI_SS_DEFAULT_INPUT, $ES_LOWERCASE))
        GUICtrlSetState(-1, $GUI_DROPACCEPTED)
        $aTabs[2] = GUICtrlCreateTabItem("tab2")
        GUICtrlCreateTabItem("")
    
        GUISetState(@SW_SHOW)
    
        GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES")
    
        ; Loop until the user exits.
        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    ExitLoop
    
                Case $idButton1
                    _MoveInputBoxToOtherTab($hGUI, $idInput, $aTabs, 0, 1)
    
                Case $idButton2
                    _MoveInputBoxToOtherTab($hGUI, $idInput, $aTabs, 1, 0)
    
                Case $idButton3
                    If Not $idNewInput Then $idNewInput = GUICtrlCreateInput("Ich möchte moven!", 50, 200, 200, 30)
            EndSwitch
        WEnd
    EndFunc   ;==>Example
    
    Func _MoveInputBoxToOtherTab($hWnd, ByRef $idInputBox, $aTabs, $iTabItemFromIndex, $iTabItemToIndex, $iTabItemSel = $iTabItemToIndex)
        Local $hInputBox = GUICtrlGetHandle($idInputBox)
        Local $sInhalt   = GUICtrlRead($idInputBox) ; Inhalt der InputBox auslesen.
        Local $aPos      = ControlGetPos($hWnd, '', $idInputBox) ; Position der InputBox merken.
        Local $iStatus   = GUICtrlGetState($idInputBox) ; Status der InputBox merken.
        Local $iStyle    = _WinAPI_GetWindowLong($hInputBox, $GWL_STYLE)
        Local $iExStyle  = _WinAPI_GetWindowLong($hInputBox, $GWL_EXSTYLE)
    
        Local $iSel      = $iTabItemSel = -1 Or $iTabItemSel <> $iTabItemToIndex ? _GUICtrlTab_GetCurSel($aTabs[0]) : $iTabItemToIndex
    
        If Not GUICtrlDelete($idInputBox) Then Return SetError(1, 0, False)
    
        _GUICtrlTab_SetCurSel($aTabs[0], $iTabItemToIndex)
        GUISwitch($hWnd, $aTabs[$iTabItemToIndex + 1]) ; TabItem auswählen, in dem die InputBox erzeugt werden soll.
        $idInputBox = GUICtrlCreateInput($sInhalt, $aPos[0], $aPos[1], $aPos[2], $aPos[3])
        $hInputBox = GUICtrlGetHandle($idInputBox)
        GUICtrlSetState(-1, $iStatus)
        _WinAPI_SetWindowLong($hInputBox, $GWL_STYLE, $iStyle)
        _WinAPI_SetWindowLong($hInputBox, $GWL_EXSTYLE, $iExStyle)
        GUICtrlCreateTabItem("")
    
        If $iTabItemSel <> $iSel Then _GUICtrlTab_SetCurSel($aTabs[0], $iSel)
    
        Return True
    EndFunc   ;==>_MoveInputBoxToOtherTab
    
    Func WM_DROPFILES($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg, $wParam ; eine Anweisung an AutoIt, dass diese Variablen hier nicht verwendet werden
        Local $aFileList = _WinAPI_DragQueryFileEx($wParam) ; , $tPoint = _WinAPI_DragQueryPoint($wParam)
        ConsoleWrite('> drag drop file: ' & _ArrayToString($aFileList, ', ') & @CRLF)
    
        Local $hActive = WinGetHandle('[ACTIVE]')
        Local $aCursorInfo = GUIGetCursorInfo(WinActivate($hWnd))
        If Not @error And $aCursorInfo[4] Then
            GUICtrlSetData($aCursorInfo[4], _ArrayToString($aFileList, ', ', 1))
        EndIf
    
        WinActivate($hActive)
        _WinAPI_DragFinish($wParam)
        Return 0
    EndFunc  ;==>_WM_NOTIFY
    Alles anzeigen
  • Editbox nachträglich in TabControl verschieben

    • Bitnugger
    • 8. November 2018 um 14:28

    Ich habe dein Script aus Post #8 mal ein wenig geändert und erweitert, damit bei der neu erstellten InputBox auch die Styles und ExStyles erhalten bleiben.

    Soweit funktioniert das auch alles, wie es soll.

    Bei Drag-n-Drop auf die InputBox ist mir allerdings ein Fehler aufgefallen... denn immer bei der jeweils ersten Aktion (nach dem Erstellen der InputBox) wird das Drop-File vor dem bereits vorhandenen Inhalt der InputBox eingefügt, bei jeder weiteren Aktion nur noch das Drop-File, obwohl in allen Fällen der vorbelegte Text in der InputBox steht.

    Edit: Obiger Fehler bei Drag-n-Drop bezieht sich auf Windows 10. Auf Windows 7 werden in allen Fällen die letzten beiden Zeichen des vorbelegten Texts in der InputBox abgeschnitten und das Drop-File dann dahinter eingefügt.

    AutoIt
    ;-- TIME_STAMP   2018-11-08 14:22:10   v 0.1
    
    #Region    ;************ Includes ************
    #Include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiTab.au3>
    #include <WinAPISysWin.au3>
    #EndRegion ;************ Includes ************
    
    Example()
    
    Func Example()
        Local $hGUI, $idButton1, $idButton2, $idButton3, $idInput, $idNewInput, $aTabs[3], $sInput
    
        $hGUI = GUICreate("Parent1", 600, 400, -1, -1, -1, $WS_EX_ACCEPTFILES)
    
        $idButton1 = GUICtrlCreateButton("Move Inputbox in Tab 2", 350,  10, 200, 50)
        $idButton2 = GUICtrlCreateButton("Move Inputbox in Tab 1", 350,  70, 200, 50)
        $idButton3 = GUICtrlCreateButton("Create Inputbox in GUI", 350, 130, 200, 50)
    
        $aTabs[0] = GUICtrlCreateTab(10, 40, 300, 300)
        $aTabs[1] = GUICtrlCreateTabItem("tab1")
        $idInput = GUICtrlCreateInput("Ich möchte moven!", 50, 150, 200, 30, BitOR($GUI_SS_DEFAULT_INPUT, $ES_LOWERCASE))
        GUICtrlSetState(-1, $GUI_DROPACCEPTED)
        $aTabs[2] = GUICtrlCreateTabItem("tab2")
        GUICtrlCreateTabItem("")
    
        GUISetState(@SW_SHOW)
    
        GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
    
        ; Loop until the user exits.
        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    ExitLoop
    
                Case $idButton1
                    _MoveInputBoxToOtherTab($hGUI, $idInput, $aTabs, 0, 1)
    
                Case $idButton2
                    _MoveInputBoxToOtherTab($hGUI, $idInput, $aTabs, 1, 0)
    
                Case $idButton3
                    If Not $idNewInput Then $idNewInput = GUICtrlCreateInput("Ich möchte moven!", 50, 200, 200, 30)
            EndSwitch
        WEnd
    EndFunc   ;==>Example
    
    Func _MoveInputBoxToOtherTab($hWnd, ByRef $idInputBox, $aTabs, $iTabItemFromIndex, $iTabItemToIndex, $iTabItemSel = $iTabItemToIndex)
        Local $hInputBox = GUICtrlGetHandle($idInputBox)
        Local $sInhalt   = GUICtrlRead($idInputBox) ; Inhalt der InputBox auslesen.
        Local $aPos      = ControlGetPos($hWnd, '', $idInputBox) ; Position der InputBox merken.
        Local $iStatus   = GUICtrlGetState($idInputBox) ; Status der InputBox merken.
        Local $iStyle    = _WinAPI_GetWindowLong($hInputBox, $GWL_STYLE)
        Local $iExStyle  = _WinAPI_GetWindowLong($hInputBox, $GWL_EXSTYLE)
    
        Local $iSel      = $iTabItemSel = -1 Or $iTabItemSel <> $iTabItemToIndex ? _GUICtrlTab_GetCurSel($aTabs[0]) : $iTabItemToIndex
    
        If Not GUICtrlDelete($idInputBox) Then Return SetError(1, 0, False)
    
        _GUICtrlTab_SetCurSel($aTabs[0], $iTabItemToIndex)
        GUISwitch($hWnd, $aTabs[$iTabItemToIndex + 1]) ; TabItem auswählen, in dem die InputBox erzeugt werden soll.
        $idInputBox = GUICtrlCreateInput($sInhalt, $aPos[0], $aPos[1], $aPos[2], $aPos[3])
        $hInputBox = GUICtrlGetHandle($idInputBox)
        GUICtrlSetState(-1, $iStatus)
        _WinAPI_SetWindowLong($hInputBox, $GWL_STYLE, $iStyle)
        _WinAPI_SetWindowLong($hInputBox, $GWL_EXSTYLE, $iExStyle)
        GUICtrlCreateTabItem("")
    
        If $iTabItemSel <> $iSel Then _GUICtrlTab_SetCurSel($aTabs[0], $iSel)
    
        Return True
    EndFunc   ;==>_MoveInputBoxToOtherTab
    
    Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg
        Local $hWndFrom = $lParam, $iIDFrom = _WinAPI_LoWord($wParam), $iCode = _WinAPI_HiWord($wParam), $sInput
    
        Switch $hWndFrom
            Case GUICtrlGetHandle($iIDFrom)
                Switch $iCode
                    Case $EN_CHANGE
                        $sInput = GUICtrlRead($iIDFrom)
                        If $sInput <> "Ich möchte moven!" Then
                            ConsoleWrite('> drag drop file: ' & $sInput & @CRLF)
                            GUICtrlSetData($iIDFrom, "Ich möchte moven!")
                        EndIf
                        ; no return value
                EndSwitch
        EndSwitch
    
        Return $GUI_RUNDEFMSG
    EndFunc  ;==>WM_COMMAND
    Alles anzeigen

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

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