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

  • Frage zu einem Befehl

    • BugFix
    • 23. April 2015 um 17:05
    Zitat von BigRox

    Wenn ich das ganze., bis jetzt, richtig verstanden habe, müsste das erste Script doch irgendwie Windows mitteilen, wohin es die angegebene
    Message weiterleiten soll

    Nein, das Skript, welches bereits die Message registriert hat, nutzt diese wie gehabt.
    In deinem anderen Skript greifst du auf die Message ja bereits zu BEVOR die registrierte Funktion des anderen Skripts überhaupt die Msg erhält. Deshalb der Hook:
    - MSG tritt auf
    - eigene Prozedur (_WinProc) wertet die MSG aus und gibt sie dann mittels Standard-Windows-Procedure wieder an das System
    - das System gibt jetzt die Nachricht an die Funktion, die diese MSG mit GuiRegisterMsg gebunden hat
    - diese Funktion verwertet nun ihrerseits die Nachricht

    Unbedingt darauf achten, dass du Nachrichten, die im anderen Skript registriert sind, auch wieder über die Standardprozedur weitergibst und nicht verwirfst. Mein Bsp. zeigt ja genau, wie das zu handhaben ist.

  • Frage zu einem Befehl

    • BugFix
    • 23. April 2015 um 14:25
    Zitat von BigRox

    So etwas wie: $Name = GetGUIRegisterMsg($WM_NOTIFY) und zurückgegeben wird mir der Name der Funktion.

    Verstehe ich nicht! DU legst doch fest, mit welcher Funktion du die Message verknüpfst. Und das kann NUR EINE sein.
    Anders sieht es aus, wenn du z.B. fertige Skripte einbindest, die ihrerseits schon mit GuiRegisterMessage arbeiten. In diesem Fall kannst du GuiRegisterMsg NICHT benutzen (da ja nur eine Funktion mit einer Message verknüpft werden kann). Um dennoch die Messages auswerten zu können musst du diese auswerten BEVOR Windows sie selbst im System verwertet. Das nennt sich Hook.
    Hier ein Bsp. wie das lösbar ist:

    AutoIt
    ;-- TIME_STAMP   2014-07-30 17:37:42
    
    
    #cs
    	WM_ -Message Hook
    	- Nachricht wird erst in einer eigenen Funktion ausgewertet
    	- dann an das System zurückgegeben (auswertbar mit GUIRegisterMsg)
    	- oder verworfen ("Return 0" nach Msg-Auswertung in _WinProc, s. Zeile 76)
    #ce
    
    
    #include <GuiImageList.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <StructureConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    
    
    ;~ Local Const $GWL_WNDPROC = -4
    
    
    $hGui = GUICreate("Test", 400, 400)
    $hListView = _GUICtrlListView_Create($hGui, "Listview", 10, 10, 380, 380)
    _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
    
    
    ; Load images
    $hImage = _GUIImageList_Create()
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
    _GUICtrlListView_SetImageList($hListView, $hImage, 1)
    
    
    ; Add columns
    _GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100)
    _GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 100)
    _GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100)
    
    
    ; Add items
    _GUICtrlListView_AddItem($hListView, "Row 1: Col 1", 0)
    _GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 2", 1)
    _GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 3", 2)
    _GUICtrlListView_AddItem($hListView, "Row 2: Col 1", 1)
    _GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 2", 1)
    _GUICtrlListView_AddItem($hListView, "Row 3: Col 1", 2)
    GUISetState()
    
    
    ;
    $hProc = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam')         ; == hier registriere ich die Funktion "_WinProc" als Callback, Returntype ist "ptr", Parametertypen
    $hHook = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, DllCallbackGetPtr($hProc))     ; == hier wird dem Fenster die Adresse der Callback-Prozedur übergeben, diese ersetzt jetzt die Standard-Window-Prozedur
    
    
    GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
    
    
    
    
    While GUIGetMsg() <> -3
        Sleep(10)
    WEnd
    
    
    _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, $hHook)                                 ; == nach Programmende: originale WinProc wiederherstellen
    DllCallbackFree($hProc)
    
    
    Func _WinProc($hWnd, $iMsg, $iwParam, $ilParam)                                    ; == die Prozedur soll ausschließlich WM_NOTIFY auswerten
    	; wenn nicht die gewünschte Msg kommt - Rückgabe an System                     ; == andere Messages werden gleich durchgereicht ans System zur Auswertung
        If $iMsg <> $WM_NOTIFY Then Return _WinAPI_CallWindowProc($hHook, $hWnd, $iMsg, $iwParam, $ilParam)
    
    
        Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
        $hWndListView = $hListView
        If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
    
    
        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
        $iCode = DllStructGetData($tNMHDR, "Code")
        Switch $hWndFrom
            Case $hWndListView
                Switch $iCode
                    Case $LVN_COLUMNCLICK ; A column was clicked                       ; == Ich möchte nicht, dass diese Msg verwertet werden kann und verwerfe sie
                        $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    					ConsoleWrite('MyProc: $LVN_COLUMNCLICK -->Column: ' & DllStructGetData($tInfo, "SubItem") & @CRLF)
    					Return 0 ; <== Nachricht wird jetzt verworfen und kann über GUIRegisterMsg nicht verwertet werden
    
    
                    Case $NM_CLICK                                                     ; == Diese Msg lasse ich durch ans System
                        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    					ConsoleWrite("MyProc: $NM_CLICK " & "-->Index: " & DllStructGetData($tInfo, "Index") & _
    											"  -->SubItem: " & DllStructGetData($tInfo, "SubItem") & @CRLF)
                EndSwitch
        EndSwitch
    	; jetzt wird die normale WinProc aufgerufen, die man mit GuiRegisterMsg auswerten kann
        Return _WinAPI_CallWindowProc($hHook, $hWnd, $iMsg, $iwParam, $ilParam)
    EndFunc   ;==>_WinProc
    
    
    
    
    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    	$hWndListView = $hListView
    	If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
    	$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    	$iCode = DllStructGetData($tNMHDR, "Code")
    	Switch $hWndFrom
    		Case $hWndListView
    			Switch $iCode
    				Case $LVN_COLUMNCLICK ; A column was clicked <== Diese Nachricht erreicht die Funktion nicht mehr
    					Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    					ConsoleWrite('GUIRegisterMsg: $LVN_COLUMNCLICK -->Column: ' & DllStructGetData($tInfo, "SubItem") & @CRLF)
    				Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
    					Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    					ConsoleWrite("GUIRegisterMsg: $NM_CLICK " & "-->Index: " & DllStructGetData($tInfo, "Index") & _
    											"  -->SubItem: " & DllStructGetData($tInfo, "SubItem") & @CRLF)
    			EndSwitch
    	EndSwitch
    	Return 0
    EndFunc   ;==>WM_NOTIFY
    Alles anzeigen
  • Wir bauen uns ein CAD

    • BugFix
    • 23. April 2015 um 10:13
    Zitat von PSblnkd

    Gibt es dafür eine Erklärung?

    Ja,
    - neues WBB
    - Serverumzug
    Da ist noch nicht alles wieder in trockenen Tüchern. Denke aber schon, dass GunFood das nach und nach aus den Backups wieder in die richtige Form giesst. ;)

  • Variable als INI behandeln?

    • BugFix
    • 23. April 2015 um 09:51
    Zitat von Lottich

    Woher zum Henker weiss man sowas?!

    Programmiertechnisch ist an dem Skript eigentlich nichts aussergewöhnlich. Ausschliesslich native AutoIt-Funktionen. Das einzige Wissen hierbei ist, wie Zeichen beim Wandeln von String zu Hex und umgekehrt aussehen. Dass man die Ascii 0-31 u. 127 (bis auf Tab und CR/LF) nicht für eine Konsolenausgabe verwenden kann, sollte auch bekannt sein. MIt solchen Zeichen also kein herkömmliches Debugging versuchen. ;)
    Und die Programmlogik ist dann das Umsetzen der Idee des Dateiaufbaus.
    Wie Andy treffend bemerkte, besteht eine Datei doch eigentlich immer nur aus Strings. :thumbup: Man muss sie nur in zugriffsbereite Form bringen (binäres Lesen/Schreiben).

    Das schöne an einem eigenen Dateiformat: Du kannst es dir so stricken und so optimieren, dass es genau für deinen Bedarf passt. Hier ging es ja darum ein klein wenig Versteck zu spielen. :rolleyes: Wenn es um schnelle Zugriffe geht, kannst du die Datei anders gestalten um z.B. mit gespeicherten Positionen ausschliesslich den gesuchten Inhalt zu lesen (und nicht erst die ganze Datei und dann mit StrInString die Position finden), wobei wir dann wieder bei einem Indexing sind. Es gibt also viele Möglichkeiten. Darum sollte man vor einem Projekt feststellen, welche Anforderungen bestehen.
    Viel Spaß beim Probieren.

  • Variable als INI behandeln?

    • BugFix
    • 23. April 2015 um 00:39

    Lottich:
    Hier mal ein Bsp., wie man ein eigenes Dateiformat aufbauen kann, mit allen Lese- und Schreibfunktionen. Für den 'Normaluser' sicher nicht zu lesen. ^^

    Code
    Beschreibung
    Byte Nr.                        Kurzname        Inhalt               Bedeutung
    1  bis 3                          TYP       hex: 42 46 46       B F F  - Dateityp (BugFix File Format)
    4  bis 9                          OPL       000000 - 999999     Länge einer folgenden optionalen Beschreibung (OPtional Length)
    10 bis (9 + OPL)                  OPT       beliebig            optionale Beschreibung (OPtional Text)
    10 + OPL bis (10 + OPL + nnn)     SPM       Random              SPaM Bytes (beliebige Länge, durch min/max Konstanten bestimmt)
    ab 1. Trenner +3                  STF       verschieden         STuFf - DER Inhalt der Datei, erkennbar durch Trennzeichenfolge


    Um wirklich jede Form von Inhalten speichern zu können (auch Null-Bytes) ist das Verwenden eines einzelnen Zeichens zum Trennen problematisch.
    Ich verwende einen 5-Byte Trenner: hex: 00 10 00 1A 00

    Um etwas Verwirrung zu stiften lasse ich meine Daten mit zusätzlichen 3 Bytes beginnen, die aus 2-mal '00' und 1-mal '20' kombiniert werden. ('00 00 20', '00 20 00', '20 00 00')
    Somit kann ich beliebig viele "Spam-Blöcke" dazwischen setzen. Meine gesuchten Inhalte sind nur dort, wo nach dem Trenner eine Kombination der 3 Bytes zu finden ist.

    Es liesse sich noch zusätzlich ein Markersystem integrieren, indem ich festlege dass das erste Daten-Byte Auskunft über den folgenden Inhalt gibt. Z.B.
    0E - Text jeder Art
    0F - Icon
    10 - BMP etc.
    Dann könnte man ganz fix alle Daten eines Typs auslesen.
    Alternativ kann man natürlich auch ausschliesslich mit einem identifizierenden Namen für die
    Folgedaten arbeiten ('main.ico' etc.), den man dann mit einem Null-Byte von den eigentlichen Daten trennt.

    Hier nun das Bsp.:

    AutoIt
    Global Const $SPAM_MIN_LEN = 500   ; Mindestlänge für Spam
    Global Const $SPAM_MAX_LEN = 800   ; Maximallänge für Spam
    Global Const $DELIM = '0010001A00' ; Trenner zwischen Blöcken (Data-Spam)
    Global Const $PREFIX_1 = '000020'  ; folgt dem Trenner als Kennung für Echtdaten
    Global Const $PREFIX_2 = '002000'  ;  ~"~
    Global Const $PREFIX_3 = '200000'  ;  ~"~
    
    
    ; Dateiname
    Local $sFile = 'MeinTest.BFF' ; Dateiendung nicht zwingend, funktioniert auch ohne oder mit irgendeiner anderen Endung.
    
    
    ; die zu schreibenden Daten
    Local $aText[] = ['Das ist ein Text.','Und hier ist noch ein Text.','Ein dritter Block.']
    
    
    ; erstelle Datei (überschreibt Datei, falls sie existiert)
    _WriteBFF($sFile, $aText, 'Ein optionaler Kommentar beliebiger Länge')
    
    
    ; optionalen Text ausgeben
    $OptionalerText = _CheckBFF($sFile)
    ConsoleWrite('Optionaler Text: ' & $OptionalerText & @CRLF)
    
    
    
    
    ; Dateninhalte lesen
    $aData = _GetData($sFile)
    If IsArray($aData) Then
    	For $data In $aData
    		ConsoleWrite($data & @LF)
    	Next
    	ConsoleWrite(@CRLF)
    Else
    	ConsoleWrite('Keine Daten!' & @CRLF)
    EndIf
    
    
    
    
    ; Inhalte ersetzen
    If Not _ReplaceData($sFile, 'Und hier ist noch ein Text.', 'NOW REPLACED') Then
    	ConsoleWrite('Gesuchte Daten nicht enthalten' & @CRLF)
    Else
    	$aData = _GetData($sFile)
    	If IsArray($aData) Then
    		For $data In $aData
    			ConsoleWrite($data & @LF)
    		Next
    		ConsoleWrite(@CRLF)
    	Else
    		ConsoleWrite('Keine Daten!' & @CRLF)
    	EndIf
    EndIf
    
    
    
    
    ; neue Inhalte hinzufügen
    _AddData($sFile, 'NEW_DATA')
    $aData = _GetData($sFile)
    If IsArray($aData) Then
    	For $data In $aData
    		ConsoleWrite($data & @LF)
    	Next
    	ConsoleWrite(@CRLF)
    Else
    	ConsoleWrite('Keine Daten!' & @CRLF)
    EndIf
    
    
    
    
    
    
    ; ============================================================================ S C H R E I B E N ===
    ; Alle Inhalte werden Zeichen für Zeichen als 2er Hex-String dargestellt
    ; ==================================================================================================
    Func _WriteBFF($sFile, $aData, $sOptText='')
    	If Not IsArray($aData) Then $aData = StringSplit($aData, '__$STR_TO_ARRAY$__', 3) ; einzelnen String in Array stecken
    	Local $iLenOpt = StringLen($sOptText)
    	Local $sWrite = _ToHex('BFF' & StringFormat('%06i', $iLenOpt)) & ($iLenOpt ? _ToHex($sOptText) : '') & _Spam()
    	For $i = 0 To UBound($aData) -1
    		; jedem Daten-Block folgt ein Spam-Block
    		$sWrite &= $DELIM & _Prefix() & _ToHex($aData[$i]) & $DELIM & _Spam()
    		; hier könnte man auch zusätzlich eine zufällige Anzahl von Spam-Blöcken (1 bis .. ) folgen lassen
    	Next
    	Local $fH = FileOpen($sFile, 2+8+16)
    	FileWrite($fH, $sWrite)
    	FileClose($fH)
    EndFunc
    
    
    
    
    ; ============================================================================ S C H R E I B E N ===
    ; Return 1 wenn OK, 0 wenn $sSearch nicht gefunden
    ; ==================================================================================================
    Func _ReplaceData($sFile, $sSearch, $sReplace)
    	$sSearch = _ToHex(_ToHex($sSearch) & $DELIM)
    	Local $fH = FileOpen($sFile, 16)
    	Local $sContent = FileRead($fH)
    	FileClose($fH)
    	Local $iPos = StringInStr($sContent, $sSearch)
    	If $iPos Then
    		$sContent = StringReplace($sContent, $sSearch, _ToHex(_ToHex($sReplace) & $DELIM))
    		$fH = FileOpen($sFile, 2+16)
    		FileWrite($fH, $sContent)
    		Return FileClose($fH)
    	Else
    		Return 0
    	EndIf
    EndFunc
    
    
    
    
    ; ============================================================================ S C H R E I B E N ===
    ; Neue Daten hinzufügen
    ; ==================================================================================================
    Func _AddData($sFile, $sData)
    	Local $fH = FileOpen($sFile, 1+16)
    	FileWrite($fH, $DELIM & _Prefix() & _ToHex($sData) & $DELIM & _Spam())
    	FileClose($fH)
    EndFunc
    
    
    
    
    ; ==================================================================================== L E S E N ===
    ; Prüfen ob Typ BFF stimmt
    ; wenn ja:   Rückgabe optionaler Text (Text oder '')
    ; wenn nein: Rückgabe -1
    ; $fGetOpenHwd=True: Rückgabe Array [$fH,Länge opt. Text] FileHandle mit Leseposition hinter Längenangabe
    ; ==================================================================================================
    Func _CheckBFF($sFile, $fGetOpenHwnd=False)
    	Local $fH = FileOpen($sFile, 16)
    	$sStart = _ToStr(_ToStr(Hex(FileRead($fH, 18))))
    	If StringLeft($sStart, 3) <> 'BFF' Then
    		FileClose($fH)
    		Return -1
    	Else
    		Local $iLen = Int(StringRight($sStart, 6))*2
    		If $fGetOpenHwnd Then
    			Local $aOut[2] = [$fH, $iLen]
    			Return $aOut
    		EndIf
    		Local $sOut = $iLen > 0 ? _ToStr(_ToStr(Hex(FileRead($fH, $iLen)))) : ''
    		FileClose($fH)
    		Return  $sOut
    	EndIf
    EndFunc
    
    
    
    
    ; ==================================================================================== L E S E N ===
    ; Alle Daten in einem Array ausgeben
    ; Erfolg: Rückgabe Array
    ; Fehler: Leersting, @error = 1
    ; ==================================================================================================
    Func _GetData($sFile) ; Lesen starten an Position: hinter Längenangabe + min-Länge-Spam
    	Local $aCheck = _CheckBFF($sFile, True)
    	If Not IsArray($aCheck) Then Return SetError(1,0,$aCheck)
    	Local $fH = $aCheck[0]
    	FileSetPos($fH, $aCheck[1]+$SPAM_MIN_LEN*2, 1) ; akt.Pos=hinter Längenangabe --> +Länge opt.Text +min.LängeSpam
    	Local $sContent = FileRead($fH) ; lesen bis zum Ende
    	FileClose($fH)
    	Local $aSplit = StringSplit($sContent, _ToHex($DELIM), 1)
    	Local $iLenP = StringLen(_ToHex($PREFIX_1)), $aData[$aSplit[0]], $iIndex = 0
    	For $i = 2 To $aSplit[0] -1
    		Switch StringMid($aSplit[$i], 1, $iLenP)
    			Case _ToHex($PREFIX_1), _ToHex($PREFIX_2), _ToHex($PREFIX_3)
    				$aData[$iIndex] = _ToStr(_ToStr(StringTrimLeft($aSplit[$i], $iLenP)))
    				$iIndex += 1
    		EndSwitch
    	Next
    	If $iIndex > 0 Then
    		ReDim $aData[$iIndex]
    	Else
    		$aData = ''
    	EndIf
    	Return $aData
    EndFunc
    
    
    
    
    ; damit beginnt jeder echte Datenblock
    Func _Prefix()
    	Local $aStart[3] = [$PREFIX_1, $PREFIX_2, $PREFIX_3]
    	Return $aStart[Random(0, 2, 1)]
    EndFunc
    
    
    Func _ToHex($s)
    	Local $sOut = ''
    	For $char In StringSplit($s, '', 2)
    		$sOut &= Hex(Asc($char), 2)
    	Next
    	Return String($sOut)
    EndFunc
    
    
    Func _ToStr($sHex)
    	Local $sOut = '', $n = 1
    	While $n < StringLen($sHex)
    		$sOut &= Chr(Dec(StringMid($sHex, $n, 2)))
    		$n += 2
    	WEnd
    	Return String($sOut)
    EndFunc
    
    
    Func _Spam() ; alle ASCII/ANSI Zeichen
    	Local $sOut = '', $iRnd
    	For $i = 1 To Random($SPAM_MIN_LEN, $SPAM_MAX_LEN, 1)
    		$iRnd = Random(0, 255, 1)
    		$sOut &= Hex(($iRnd <> 127 ? $iRnd : 0), 2)
    	Next
    	; ausschliessen, dass Spam mit Datenkennung beginnt
    	Switch StringLeft($sOut, 6)
    		Case $PREFIX_1, $PREFIX_2, $PREFIX_3
    			$sOut = StringLeft($sOut, 4) & '7E' & StringTrimLeft($sOut, 6)
    	EndSwitch
    	Return String($sOut)
    EndFunc
    Alles anzeigen
  • mehrere Dateien in einem Verzeichnis auf jeweils 3 bestimmte Strings prüfen + Ausgabe der Ergebnisse in eine Datei

    • BugFix
    • 18. April 2015 um 10:00

    Deine Suche nach den Inhalten ist ziemlich kompliziert. Mittels Regexp geht das wesentlich komfortabler.
    Probier mal so:

    AutoIt
    ;~ DateiListe abarbeiten
    For $i = 1 To UBound($aFiles)-1
    	$sText &= @CRLF & @CRLF & "--------------- " & $sPath & _
    	"\" & $aFiles[$i] & "---------------" & @CRLF & @CRLF ;TrennLinie zw. den Dateien
    	$sContent = FileRead($sPath & "\" & $aFiles[$i]) 
    	$sText &= $sContent ;Dateiinhalt (gesamt) hinzufügen ; <----- HIER DENKE ICH MUSS DIE 3 ZEILENSUCHE EINGEFÜGT WEDEN
    
    	; jetzt scannst du den Inhalt nach den 3 Zeilen
    	$aMatch = StringRegExp($sContent, "(Total (?:found|bkp|skipped) dbs: \d+)", 3)
    	If IsArray($aMatch) Then
    		For $n = 0 To UBound($aMatch) -1
    			$sText &= $aMatch[$n] & @CRLF
    		Next
    	EndIf
    Next
    Alles anzeigen
  • Suchfunktion automatisieren

    • BugFix
    • 14. April 2015 um 19:51

    Thema wieder offen, siehe mein Edit im vorigen Post.

  • Suchfunktion automatisieren

    • BugFix
    • 13. April 2015 um 13:07
    Zitat von noXQses

    Allerdings kann man den Paragraphen auch mal genau unter die Lupe nehmen:

    Deshalb mein Angebot, dass du Klarheit über Kontakt zum PS Support herstellst. Was ist an dem Vorschlag falsch?
    Wenn die Lesart hier tatsächlich unterschiedlich ist, liegt doch nichts näher als Eindeutigkeit zu schaffen. Und ich habe absolut kein Problem damit eine Entscheidung zu korrigieren.

    Wir haben in der Vergangenheit oft Probleme mit deutlichen Regelverstößen gehabt. Das hat natürlich zu einer Sensibilisierung für dieses Themas bei allen Usern geführt. Sei also bitte nicht zu dünnhäutig, wenn hier etwas emotionale Äußerungen aufkommen.

    Bitte hab Verständnis, dass ich den Thread vorerst schließe, bis die Einverständniserklärung vom PS Support vorliegt. (per PN/Mail an mich oder anderen Mod)
    Das bewahrt dich auch vor eventuellen weiteren emotionalen Posts.


    EDIT:

    Die Rückmeldung vom Support liegt nun vor:

    Spoiler anzeigen

    ps_support.png

    Somit steht einer Hilfestellung nichts im Wege, das Thema ist wieder offen.

  • Suchfunktion automatisieren

    • BugFix
    • 13. April 2015 um 11:09
    Zitat von noXQses

    Aber weniger A****loch-Modus wäre nice


    Bei jedem Post, der Automatisierungen in Bezug mit einer Software/einer Website zum Inhalt hat, werfe ich einen Blick in die AGB des Anbieters. Und das aus gutem Grund. Du hast unsere Forenregeln gelesen? Dann wird der Bezug klar.
    Persönlich sehe ich in deinem Vorhaben auch kein großes Problem. Aber der explizite Hinweis in den Nutzungsbedingungen schließt ein solches Vorgehen defacto aus. Deshalb mein Hinweis.

    Vorschlag zu einer Win-Win-Situation:
    Da bei PS solch top Support besteht, lass dir doch einfach bestätigen, dass dein Vorhaben von PS nicht als Verstoß gegen die Nutzungsbedingungen gesehen wird. Dann kann man auch guten Gewissens hier Unterstützung anbieten.

    P.S. Manchmal muss ich auch A****loch sein, das bringt der Job als Mod so mit sich. ;)

  • Suchfunktion automatisieren

    • BugFix
    • 13. April 2015 um 09:51
    Zitat von noXQses

    Mein Plan ist jedoch, die Suchfunktion z.B. alle 10-30 Sekunden automatisch laufen zu lassen, sodass ich meinem Freund folgen kann, sobald er z.B. in einem MultiTableTournament (MTT) zufällig auf einen anderen Tisch gesetzt wird, ohne, dass ich erneut manuell nach ihm suchen muss. Also absolut nichts verbotenes!


    Wirklich nicht?

    Zitat von Nutzungsbedingungen PokerStars

    5. VERBOTENE NUTZUNGEN

    • ....
    • 5.6 AUTOMATISCHE SPIELER (BOTS). Die Nutzung künstlicher Intelligenz - einschließlich, jedoch nicht begrenzt auf, "Robots" - ist in Verbindung mit der Dienstleistung strengstens verboten. Alle Handlungen, welche ein Nutzer in Bezug auf die Dienstleistung vornimmt, müssen von den Spielern persönlich über die Benutzeroberfläche vorgenommen werden, welche durch die Nutzung der Software zugänglich ist.
  • primzahlenrechner

    • BugFix
    • 12. April 2015 um 20:41
    Zitat von ProgrammingDonkey

    Sind es 333334 bis eine Mio?

    Überleg doch mal logisch: Demnach wäre jede 3.te Zahl eine Primzahl! Schau doch einfach mal die Zahlen 1-20 an, wie dort die Verteilung ist, dann wird dir klar, dass das nicht möglich sein kann.

  • primzahlenrechner

    • BugFix
    • 12. April 2015 um 17:47
    Zitat von Kanashius

    und dann mit ReDim alle restlichen "abschneiden"

    Wenn du ReDim verwendest kannst du auch gleich bei ArrayDelete bleiben, macht keinen Unterschied. Einfacher: Index führen für letztes Element.

  • Programm startet zu häufig!! -- $cmdline fehler?

    • BugFix
    • 4. April 2015 um 10:25

    Du fängst doch die Button-ID sowieso in einem Array auf. Nimm dafür ein 2D-Array und füge die aufzurufende Funktion mit hinzu.

    z.B. so:

    [autoit]

    While 1
    $nMsg = GUIGetMsg()
    For $i = 0 To UBound($_SCRIPT_GUI_BUTTONS) -1
    ; Ausführen - wenn man das Array als 2D erstellt kann man die ID an [$i][0] und den Programmnamen an [$i][1] führen
    If $_SCRIPT_GUI_BUTTONS[$i][0] = $nMsg Then
    ; dann wäre hier: Call($_SCRIPT_GUI_BUTTONS[$i][1])
    EndIf
    ExitLoop
    Next
    ; ...
    WEnd

    [/autoit]

    Edit: Syntaxhighlight scheint ja besser zu sein - dafür werden jetzt alle Indents gekillt, wenn man den Code einfügt - Shit. Nacheditieren nützt nichts. :thumbdown:

  • ConsoleRead() geht nicht, AI 3.3.12

    • BugFix
    • 2. April 2015 um 09:23
    Zitat von awenglaweng

    Aber es holt keinen user-input

    Es wäre hilfreich, wenn du deinen Test-Code auch postest. So müssen wir raten, was du vorhast, da du es auch nicht konkret beschreibst.

    Meine Vermutung:
    - Anwendung ohne grafische Oberfläche
    - Ein- und Ausgaben sollen über eine Console erfolgen

    Wenn dem so ist, solltest du mit der Console-UDF arbeiten. Findest du hier im Forum, hat progandy mal erstellt.

    Aber du kannst doch die Usereingabe z.B. auch über eine Inputbox abfragen. Skript als CUI heisst doch nicht, dass grafische Elemente nicht verwendet werden können. Du hast bei CUI nur zusätzlich die Möglichkeit in den Outputstream (sprich in die Konsole) zu schreiben.

  • [Sammelthread] Fangfragen, Rätsel & Co

    • BugFix
    • 28. März 2015 um 22:52

    Mir fällt noch ein Rätsel ein, nicht allzu schwer denke ich:

    Ein Haus (normaler rechteckiger Grundriss) hat in jeder Wand ein Fenster. Egal aus welchem Fenster du guckst, immer siehst du 3 Pferde. Wieviel Pferde sind dort insgesamt?

    Lösung


    - an jeder Ecke steht ein Pferd = 4
    - mittig vor jeder Seite steht ein Pferd = 4
    somit sind immer die Pferde der zwei Ecken und das mittig stehende zu sehen
    Lösung: 8

  • Bilder verschwinden hinter Radio-Control, wenn der Mauszeiger drüber fährt

    • BugFix
    • 25. März 2015 um 08:53
    Zitat von Mistil

    Dieser wird von Kaspersky als Trojaner erkannt.


    Verwende beim Kompilieren kein UPX. Das wird von den Virenwächtern oft als Indiz einer möglichen Schadsoftware interpretiert. Schon hunderte AutoIt-User haben das immer und immer wieder an die Hersteller der Anti-Virensoftware als Fehler gemeldet - ist denen aber wie du siehst scheißegal. Die möchten gerne Angst produzieren um ihre Produkte zu verkaufen.

    NB: Wenn dan Problem gelöst ist, setze bitte den Status im Startpost auch auf "gelöst".

  • Ini: Alle Sectionen nach Wert durchsuchen

    • BugFix
    • 24. März 2015 um 14:27
    Zitat von AspirinJunkie

    Scheint ja ein richtig durchdachtes System zu sein...

    :rofl: Der Tag ist gerettet...

  • speichern unter im browser anklicken

    • BugFix
    • 24. März 2015 um 14:24
    Zitat von turbobaby

    CLASS:#32770


    Das ist die "allgemeine Windows Fensterklasse", d.h. jedes nicht spezifizierte Fenster in Windows gehört dieser Klasse an. Du musst also zusätzliche Inhalte des Fensters (Text) für die Identifizierung verwenden.

  • Bilder verschwinden hinter Radio-Control, wenn der Mauszeiger drüber fährt

    • BugFix
    • 24. März 2015 um 14:12

    Dein Ziel war ja anzuzeigen: <Radio> (ohne Text) <Picture> <Text zum Radio>
    Dann kombiniere aus den 3 Control doch eines und arbeite damit. So gehts: (du kannst auf das Radio selbst oder Picture oder Label klicken, alles funzt)

    Spoiler anzeigen
    [autoit]


    #Include <WindowsConstants.au3>

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

    Global $aRadio[2]

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

    $gui = GUICreate('Test')
    $aRadio[0] = _GuiCtrlRadioPict_Create($gui, 'Radio-1', "C:/Users/Pictures/__1.JPG", 10, 10) ; hier deine Bildpfade anpassen (jpg, gif, bmp)
    $aRadio[1] = _GuiCtrlRadioPict_Create($gui, 'Radio-2', "C:/Users/Pictures/__2.JPG", 10, 40)
    GuiCtrlSetState( ($aRadio[1])[0], $GUI_CHECKED)

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

    GUISetState()

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

    While True
    Switch GuiGetMsg()
    Case -3
    Exit
    Case $GUI_EVENT_PRIMARYUP
    For $i = 0 To UBound($aRadio) -1
    If _GuiCtrlRadioPict_IsClicked($gui, $aRadio[$i]) Then ExitLoop
    Next
    EndSwitch
    WEnd

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

    ; liefert ein Array zurück, an [0] ist die ID des Radio
    Func _GuiCtrlRadioPict_Create($hGui, $sText, $sPathPict, $iX, $iY, $style=-1, $exStyle=-1)
    Local $iMargin = 5 ; Platz zwischen Radio und Picture sowie zwischen Picture und Text
    Local $tmpGUI = GUICreate('TMP')
    GUISwitch($tmpGUI)
    Local $tmpRadio = GUICtrlCreateRadio(' ', 0, 0)
    Local $tmpLabel = GUICtrlCreateLabel($sText, 0, 40)
    Local $aSizeR = ControlGetPos($tmpGUI, '', $tmpRadio)
    Local $aSizeL = ControlGetPos($tmpGUI, '', $tmpLabel)
    GUICtrlDelete($tmpRadio)
    GUICtrlDelete($tmpLabel)
    GUISwitch($hGUI)
    GUIDelete($tmpGUI)
    Local $radio = GUICtrlCreateRadio('', $iX, $iY, $aSizeR[2], $aSizeR[3], $style, $exStyle)
    Local $pict = GUICtrlCreatePic($sPathPict, $iX+$aSizeR[2]+$iMargin, $iY, $aSizeR[3], $aSizeR[3])
    Local $label = GUICtrlCreateLabel($sText, _
    $iX +$aSizeR[2] +$iMargin +$aSizeR[3] +$iMargin, _ ; x-Pos + Radiobreite + Margin + Picturebreite + Margin
    $iY +4, _ ; y-Pos +4
    $aSizeL[2], $aSizeL[3])
    Local $aOut[3] = [$radio, $pict, $label] ; [ID-Radio, ID-Pict, ID-Label]
    Return $aOut
    EndFunc

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

    Func _GuiCtrlRadioPict_IsClicked($hGui, ByRef $aRadio)
    Local $aCursor = GUIGetCursorInfo($hGui), $id_Match = False, $radioMatch = False
    Switch $aCursor[4]
    Case $aRadio[0] ; Radio
    $id_Match = True
    $radioMatch = True
    Case $aRadio[1], $aRadio[2] ; Pict, Label
    $id_Match = True
    EndSwitch
    If $id_Match Then
    If Not $radioMatch Then ControlClick($hGui, '', $aRadio[0])
    Return True
    Else
    Return False
    EndIf
    EndFunc

    [/autoit]
  • speichern unter im browser anklicken

    • BugFix
    • 23. März 2015 um 21:21

    Wozu so kompliziert?
    AVM ist extrem kundenfreundlich und hat Schnittstellen für fast alles vorbereitet:
    Einstellungen sichern/wiederherstellen, Werkseinstellungen, Neustart

    Hier findest du die kpl. Schnittstellenübersicht.


    Edit:
    Es hat sich schon mal jemand die Mühe gemacht das in VBS zu implementieren. Die meisten der Funktionen gibt es schon nativ oder als UDF in AutoIt. Es sollte also nicht zu schwierig sein, das zu portieren.

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™