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

  • Probleme mit Run und Leerzeichen im exe-Pfad

    • BugFix
    • 14. Juli 2017 um 08:24

    Ein viel zu häufig vergessener Befehl ist StringFormat. Damit schreibt man den Befehl genau, wie in einer Kommandozeile (nur mit Platzhaltern) formatiert:

    AutoIt
    $sXPDFInfo = "D:\User\Desktop\Neuer Ordner(3)"
    $sPDFFile = "pdfinfo.exe"
    $sCmd = @ComSpec & ' /c ""' & $sXPDFInfo & '" "' & $sPDFFile & '""'
    ; sCmd: C:\Windows\system32\cmd.exe /c ""D:\User\Desktop\Neuer Ordner(3)" "pdfinfo.exe""
    
    
    ; oder
    $sCmd = StringFormat('%s /c "%s" "%s"', @ComSpec, $sXPDFInfo, $sPDFFile)
    
    
    Run($sCmd, @ScriptDir, @SW_HIDE, 2)
    Alles anzeigen

    Vereinfacht m.M. die Angelegenheit und man sieht auf den ersten Blick, was ausgeführt wird.

  • Text verschlüsseln/entschlüsseln

    • BugFix
    • 12. Juli 2017 um 13:52

    Wenn du im Code ein Passwort ablegen willst(musst) ist es, wie vorab gesagt, kein besonders sicherer Zustand. Ein wenig aufpeppen geht, indem du dass Passwort mit sich selbst verschlüsselst und den verschlüsselten Wert im Code ablegst. Ein vom User eingegebenes Passwort wird dann niemals entschlüsselt, sondern wiederum nur mit sich selbst verschlüsselt und mit dem hinterlegten Wert abgeglichen. Ist für den mit AutoIt möglichen Sicherheitsrahmen recht brauchbar (wenn auch nicht wirklich sicher).

  • Kleine Programmierung

    • BugFix
    • 9. Juli 2017 um 00:10
    Zitat

    Warning: If You Found A Private Key With Balance But Not Belongs To You, Before you moves Any of its FUNDS, You should consults your lawyer about local law against Crypto Currencies.

    Ich bin juristisch nicht dermaßen bewandert, dass ich sagen kann, wie die gesetzlichen Regelungen zu dieser Thematik in Deutschland sind.

    Klar ist jedenfalls:
    Der TE möchte die Seiten durchsuchen nach Guthaben und sich diese transferieren (ob das legal oder nicht ist - s.o.).

    Ich denke niemand hat Interesse daran, sein Hirnschmalz einzusetzen, damit sich ein Dritter einen schmalen Fuß macht und kassiert.
    In diesem Sinne: CLOSED

  • Datum in DateTimePicker in externer Anwendung ändern

    • BugFix
    • 2. Juli 2017 um 22:48

    Warum verwendest du nicht die Funktionen der GuiDateTimePicker.au3?
    Das Handle für das TimePicker-Control kannst du abfragen und für die UDF verwenden.

  • [gelöst] Textlänge in Pixel ermitteln

    • BugFix
    • 1. Juli 2017 um 09:33
    Zitat von BigRox

    Wenn GDI+ schon vorm Aufruf der Funktion mit _GDIPlus_Startup() gestartet wurde, beendet dies Funktion dann einfach GDI+, weil da ja am Ende _GDIPlus_ShutDown() aufgerufen wird, oder läuft GDI+ auch nach dieser Funktion dann noch weiter, da ja dann auch noch einige GDI+-Objekte existieren ?

    Der Mechanismus ist folgender:
    Über einen UDF-internen Zähler wird festgestellt, wie oft StartUp bzw. ShutDown aufgerufen wird. Dabei wird der Zähler rauf/runter gesetzt. Nur wenn er bei 0 ist, wird beim ShutDown auch die Dll geschlossen.

  • [gelöst] Textlänge in Pixel ermitteln

    • BugFix
    • 26. Juni 2017 um 15:44

    Ja, Oscar - ich glaube über die Funktion hatten wir schon mal gesprochen. Sie ermöglicht aber nicht, die Textlänge vor Erstellen des Ctrl zu ermitteln. Ist ja klar - irgendwo muß der Text ja mit seiner Formatierung abgemessen werden.
    Wenn du verschiedene Texte in einem Ctrl anzeigen möchtest, brauchst du die max. Länge um folgende Ctrl genau positionieren zu können. Also eher eine Funktion, die während der Skriptentwicklung Anwendung findet, weniger im fertigen Skript.

  • [gelöst] Textlänge in Pixel ermitteln

    • BugFix
    • 26. Juni 2017 um 14:37

    Dafür hatte ich mal folgende Funktion erstellt:

    AutoIt
    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _GetTextMeasure
    ; Description ...: Ermittelt den Platz zur Darstellung eines Textes unter Angabe von Größe, Attributen und Font
    ; Syntax.........: _MeasureText($sText, $iSize, $iStyle, $sFont)
    ; Parameters ....: $sText    Der auszumessende Text
    ;                  $iSize    Die Größe des Fonts in pt
    ;                  $iStyle   Kombination der Textattribute
    ;                            0 - Normal weight or thickness of the typeface (Standard)
    ;                            1 - Bold typeface
    ;                            2 - Italic typeface
    ;                            4 - Underline
    ;                            8 - Strikethrough
    ;                  $sFont    Name des verwendeten Fonts (Standard='Arial')
    ; Return values .: Array[Höhe, Breite]
    ; Author ........: BugFix ( AutoIt@bug-fix.info )
    ; ===============================================================================================================================
    #include-once
    #include <GDIPlus.au3>
    Func _GetTextMeasure($sText, $iSize=8.5, $iStyle=0, $sFont='Microsoft Sans Serif')
    	_GDIPlus_Startup()
    	Local $hGUI = GUICreate("", 800, 400)
    	GUISetState(@SW_HIDE, $hGUI)
        Local $hFormat = _GDIPlus_StringFormatCreate(0)
        Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
        Local $hFont = _GDIPlus_FontCreate($hFamily, $iSize, $iStyle, 3)
        Local $tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)
    	Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
        Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $sText, $hFont, $tLayout, $hFormat)
        Local $iWidth = Ceiling(DllStructGetData($aInfo[0], "Width"))
        Local $iHeight = Ceiling(DllStructGetData($aInfo[0], "Height"))
    	_GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_FontDispose($hFont)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_GraphicsDispose($hGraphic)
        _GDIPlus_ShutDown()
    	GUIDelete($hGUI)
    	Local $aOut[2] = [$iHeight,$iWidth]
    	Return $aOut
    EndFunc  ;==>_GetTextMeasure
    Alles anzeigen
  • _Arraytostring kein Delimiter?

    • BugFix
    • 26. Juni 2017 um 11:18

    Du hast den falschen Parameter besetzt für dein Trennzeichen. Der erste Trenner ist für Spalten, der zweite für Zeilen. ;)
    So soll die Zeile aussehen:
    $aVDaten = _ArrayToString($StringSplit, "", 2, UBound($StringSplit)-2, "/")

    P.S. Bitte solch kleine Datei nicht anhängen, sondern mit Code-Tags (Symbol </> im Editor) einfügen.

  • Tooltip - Inhalt von Eingabefeld

    • BugFix
    • 21. Juni 2017 um 08:40

    @Bitnugger: Da hast du es dir aber ziemlich kompliziert gemacht ;)
    Einen Großteil deines Codes kannst du eindampfen, wenn du GuiGetCursorInfo verwendest, um die ID zu ermitteln, über der sich die Maus bewegt.

    Zitat von AutoIt-Hilfe

    GUIGetCursorInfo

    Gets the mouse cursor position relative to GUI window.

    Success: a five-element array that containing the mouse cursor information:
    $aArray[0] = X coord (horizontal)
    $aArray[1] = Y coord (vertical)
    $aArray[2] = Primary down (1 if pressed, 0 if not pressed)
    $aArray[3] = Secondary down (1 if pressed, 0 if not pressed)
    $aArray[4] = ID of the control that the mouse cursor is hovering over (or 0 if none)
  • Tooltip - Inhalt von Eingabefeld

    • BugFix
    • 20. Juni 2017 um 15:59

    Alternativ könntest du auch den Rechtsklick auf das Input auswerten und dann den Inhalt per MsgBox ausgeben.

  • Variablen Deklaration Unterschiede

    • BugFix
    • 20. Juni 2017 um 12:13

    Um Probleme mit den Scopes zu vermeiden, sollte man sich angewöhnen (zumindest bei mehr als 10..20 Zeilen Skript), immer mit Scope zu deklarieren. Es ist zwar "nett gemeint", dass man auch ohne Scopeangabe deklarieren kann, aber das verleitet auch zu Fehlern.

  • GuiCtrlCreate / GuiCtrlSetData programmatisch erstellen / beschreiben

    • BugFix
    • 13. Juni 2017 um 10:48

    Global $aInput[2] = [1]
    Das ist nicht die Zuweisung für den INdex "2", sondern Deklaration mit Zuweisung. Linke Seite Deklaration mit Anzahl der Elemente (2), rechte Seite die Werte. Da nur ein Wert eingetragen ist, wird dieser dem Index "0" zugeordnet. Kannst ja mal in mein Array-Tut (s. Signatur) schauen. ;)

  • GuiCtrlCreate / GuiCtrlSetData programmatisch erstellen / beschreiben

    • BugFix
    • 13. Juni 2017 um 10:23

    Hier mal aus meiner Beispielsammlung: Erstellung Dynamischer Control.
    Wenn du das in eine Schleife packst kannst du eine definierte Anzahl Control erstellen. Das Resizing benötigst du dann sicher nicht.

    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
  • Stottern unter Windows 10

    • BugFix
    • 4. Juni 2017 um 10:21

    Ich würde etwas anders herangehen, als mit Try & Error alles mal abzustöpseln und sehen, ob was passiert.

    <Task Manager> <Leistung> --> Ressourcenmonitor starten. Nun kannst du mal ganz gezielt beobachten, ob dort zyklisch Spitzen auftreten (CPU, RAM, Netzwerk). Denn ein kurzes Einfrieren muß eine Spitzenlast in einer Komponente mit sich bringen.

    Der Gedanke mit den USB-Komponenten ist durchaus überdenkenswert, denn häufig werden USB-Treiber nicht richtig installiert und im Hintergrund versucht das System "es zu richten". Konsequenterweise sollten dann aber über den Gerätemanager rigoros alle USB-Komponenten deinstalliert werden. Anschliessend nach neuen Geräten suchen lassen und alles wird frisch installiert.

    @BLinz: Bei deiner systematischen Fehlersuche hast du aber vergessen: Immer nur eine Änderung/Überprüfung vornehmen und dann erneut testen, ansonsten hast du u.U. den Fehler "weggesucht", was dir zwar temporär hilft, aber nicht wirklich sinnvoll ist, falls das Problem erneut auftritt.

  • AutoIt und Chip-Installer... :-)

    • BugFix
    • 2. Juni 2017 um 09:00
    Zitat von alpines

    Predigen aber, dass man von E-Mails die Anhänge nicht öffnen soll

    In dem Zusammenhang finde ich es immer abartig, wenn aus dem Hause Microsoft das Thema Sicherheit aufgegriffen wird. (Win 10 - jetzt soooo viel mehr Sicherheit für den User bla-bla-kotz). Dabei verhindert M$ hartnäckig in jeder OS-Version, dass unerfahrene User überhaupt sehen können, was für Dateitypen auf irgendwelchen Datenträgern sind - Standardeinstellung: "Erweiterungen bei bekannten Dateitypen ausblenden". :Face:

  • Schließen einer "ge - run() - ten" Anwendung deaktivieren

    • BugFix
    • 1. Juni 2017 um 17:34
    Zitat von AutoItler

    gar nicht brauche.

    Das siehst du falsch. :/
    Der Dummy diente nur zur Verdeutlichung. dass <F4> normal funktioniert, <Alt+F4> aber ohne Wirkung ist. Und dazu ist der Hook zwingend notwendig.

  • Benennung von Anhängen in Forumsbeiträgen

    • BugFix
    • 31. Mai 2017 um 20:13

    Das Thema Speichern-und-Wiederfinden ist ja ein absoluter Dauerbrenner.
    Ich stamme ja noch aus der Zeit, als Computer Laufen lernten. Da war ausser Speichern in Ordner-Unterordner-UnterUnterordner... eh nichts möglich. Dieses eigentlich recht sinnvolle System halte ich im Wesentlichen bei.
    Heute haben wir sauschnelle Rechner, riesige Festplatten und brauchen uns an keine Speicherkonventionen halten. So wie in der Lagerwirtschaft die Chaoslagerung (Alles wird dort abgelegt, wo gerade Platz ist, dadurch verringern sich die Wege und Zeiten beim Konfektionieren) höchste Effektivität garantiert, ist Speichern von Daten ein ähnlicher Vorgang. Hier ist Verwaltung der Daten über ein System mit Tags optimal. Ich nutze sowas auf der Arbeit. Zu Belegen werden Tags mit gespeichert. Über eine browserähnliche Oberfläche kann ich google-like alle Dokumente nach den Tags (oder auch Volltext) durchsuchen. Das wird m. M. nach in Zukunft auf allen Systemen Standard werden. Dateien unter "sinnvollen" Namen speichern? - Wozu? - Beim Speichern Taggen und es kann viel effektiver gesucht werden.
    Ich nutze zum Suchen in meinen Skripten immer "Suche in Dateien". Das geht bei meinen ca. 1500 Skripten in ca. 5 - 10 Sekunden über die Bühne und ich bekomme in SciTE die kpl. Code-Zeile, in der der Begriff gefunden wurde ausgegeben. Wenn ich also in fremde Skripte eine Kommentarzeile einfüge mit Tags, die den Inhalt des Skripts verdeutlichen, kann ich mithilfe dieser Tags in Dateien Suchen.

  • Eigene GUI an ein gestartetes Programm "anheften" ...

    • BugFix
    • 31. Mai 2017 um 19:41
    Zitat von alpines

    Events für fremde Fenster direkt kann man glaube ich nicht registrieren.

    Aber ja doch. ;) _WinAPI_SetWindowsHookEx ersetzt die Standard-Fenster-Prozedur und ein Callback wertet die WM_Messages aus oder verwirft diese oder läßt sie mit _WinAPI_CallNextHookEx an das System durch. Das geht mit allen Windows-Fenstern, die ihre Nachrichten in Windows-üblicher Weise abarbeiten.

  • Schließen einer "ge - run() - ten" Anwendung deaktivieren

    • BugFix
    • 31. Mai 2017 um 19:31

    @AutoItler Ich habe das Bsp. nochmal etwas abgeändert und kommentiert.

  • Schließen einer "ge - run() - ten" Anwendung deaktivieren

    • BugFix
    • 30. Mai 2017 um 18:17

    Wenn HotKey nicht hilft, musst du in der Messageverarbeitung systemnah ansetzen und <Alt+F4> nicht an das System durchreichen. Das macht man mit einem Hook.
    Wichtig ist, die Hookfunktion zu verlassen, wenn das gewünschte Fenster nicht aktiv ist. Auch die Systembereinigung beim Beenden ist ein absolutes Muss!

    AutoIt
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>
    
    
    Opt("GUIOnEventMode", 1)
    OnAutoItExitRegister('OnAutoItExit')
    
    
    Global $hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
    Global $hmod = _WinAPI_GetModuleHandle(0)
    Global $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)
    
    
    Global $hWin   ; = Handle des AcrobatReader
    Global $fActive = False  ; <== to allow hook only on this gui
    ;~ Global $isAlt = False   -- besser als Static in der Callbackfunktion
    
    
    ;==== DEMO
    $hWin = GUICreate('None <Alt>+<F4>')
    GUISetOnEvent(-3, '_end')
    
    
    $dummy = GUICtrlCreateDummy()
    GUICtrlSetOnEvent(-1, '_dummy')
    
    
    GUISetState()
    
    
    
    
    Global $a[1][2] = [['{F4}',$dummy]]
    GUISetAccelerators($a)
    
    
    
    
    While 1 ; bei dir sinnvoll: While ProcessExists($PID_AcrobatReader)
    	_checkWinState()
    	Sleep(100)
    WEnd
    
    
    Func _checkWinState() ; Hook wird somit auf das gewählte Fenster begrenzt
    	If Not $fActive And BitAND(WinGetState($hWin), 8) Then
    		$fActive = True
    	ElseIf $fActive And Not BitAND(WinGetState($hWin), 8) Then
    		$fActive = False
    	EndIf
    EndFunc
    
    
    Func _dummy()
    	ConsoleWrite('F4 clicked!' & @CRLF)
    EndFunc
    Alles anzeigen

    EDIT:

    Ich habe den Code nochmal abgeändert. In der ersten Version wäre <F4> immer "verschluckt" worden. :whistling:
    Sind auch noch ein paar Kommentare bei.

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™