Sehr beeindruckend Andy
! Nicht nur mathematisch sondern auch ästhetisch ansprechend :D.
Beiträge von name22
-
-
Büddeschön Raupi
.Ich reiße mir währenddessen mal dreist deine Funktion unter den Nagel und speichere sie in meiner Sammlung.
-
Sicher, dass web.de einer solchen Automatisierung zustimmt?
-
Ist gut jetzt
. Das wurde schon beim letzten mal zu Genüge breitgetreten... -
Nichts für ungut, aber auf mich wirkt dein Script völlig konfus...
Um dir kurz zu erklären was ich meine:- Du verwendest Assign um einem Array-Element einen Wert zuzuweisen.
1. Assign verlangt den Namen einer Variable als String für den ersten Parameter, nicht den Wert der Variable.
2. Du brauchst kein Assign um einen Wert einer Variable zuzuweisen.
3. Du kannst einem Arrayelement keinen Wert mit Assign zuweisen, das ist nicht möglich und steht auch ausdrücklich so in der Hilfe.
4. Assign gibt einen Integerwert (0 oder 1) zurück, es macht keinen Sinn das in eine Variable zu schreiben.
-> Du verwendest Assign so falsch wie ich es nie zuvor gesehen habe und ich bin mir noch nicht mal sicher, was du eigentlich damit erreichen willst.- Der Wert von Assign der in $kachel gespeichert wurde (in deinem Fall 0 weil Assign fehlschlägt).
1. Du versuchst einen DC (DeviceContext) aus diesem Wert (0) zu erzeugen, was in deinem Fall absolut keinen Sinn macht.
2. Danach versuchst du auf einen DC (0) der kein DC ist ein Icon zu zeichnen das kein Icon ist. Das was das Icon sein sollte ist der DC von Punkt 1 der keinen Sinn macht aus offensichtlichen Gründen.
3. Du versuchst GUICtrlSetImage mit einem handle zu einem Icon im Arbeitsspeicher zu verwenden, obwohl die Funktion nur Dateinamen zu Icondateien auf der HDD akzeptiert.
-> Du hast vermutlich nicht verstanden wie mein Script vorgeht, was ich dir keineswegs ankreiden will, schließlich habe ich keine Kommentare eingefügt, aber man sieht es.. deutlich.Das sind maximal 10% der Probleme die mir aufgefallen sind. Dein Script ist nur lauffähig, weil die Funktionen die falsch benutzt werden netterweise nur einen Fehlercode zurückgeben.
Fast jede Funktion die aus meinem Script stammt hat mindestens einen komplett falschen Parameter. Ich bin mir nicht sicher was du da schreibst, aber ich glaube nicht dass es AutoIt ist. Denn du verwendest selbst Standardbefehle wie Assign falsch. -
Nun.. Ich bin mir wirklich nicht sicher, was ich dazu sagen sollte. So eine Vorstellung hatten wir bisher nur zwei mal, so weit ich mich erinnern kann.
Ich bin zwar kein Audi-Fan, aber dafür interessiere ich mich für Programmiersprachen, AutoIt um genau zu sein. Auch wenn die möglichkeit besteht, dass ich seit Jahren in einem Audi Fanforum über Computer und Programmiersprachen geredet habe, halte ich es doch für wahrscheinlicher, dass es sich hier um ein IT orientiertes Supportforum für die Scriptsprache AutoIt handelt.
Ich heiße dich jedenfalls herzlich in unserem Forum willkommen Katharina. Du wirst hier vielleicht nicht all zu viele Audi Enthusiasten finden, aber kannst dafür lernen wie man ein Vorgänge automatisiert und eigene Programme entwickelt.
Das Thema Audi ist dann alerdings doch für "Off-Topic" reserviert.
-
Das war nicht deine Frage. Aber du hast Recht, das könnte er machen. Er weiß auch wie es geht, aber wie du aus seinem Text entnehmen kannst ist sein Script lediglich ein kleiner Test des Algorithmus. Proof-of-concept sozusagen...
-
Dein Computer ist langsam und braucht dadurch mehr Zeit um jede einzelne Frame zu berechnen. Bei mir läuft es mit einer Wartezeit von 50 Millisekunden zwischen jedem Schleifendurchgang flüssig, weil mein PC wesentlich schneller ist und nur einen Bruchteil der Zeit benötigt um die Frame zu erzeugen. Ich habe also mehr Frames pro Sekunde als du. Wenn du nun die Wartezeit verringerst, verringerst du die Gesamtzeit zwischen jeder Frame und gleichst den Unterschied somit aus.
Um so etwas zu vermeiden, verwende ich bei aufwändigeren GDI+ Animationen meist eine Schleife, deren Wartezeit sich an die Leistung des Computers anpasst. Da gibt es das Problem nicht.
-
Ich bin mal so nett und stelle das hier als Antwort auf deine Frage in der SB (wie man die letzte Zahl einer Zeile auslesen könne) rein.
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]$sText = FileRead(@ScriptDir & "\t.txt")
[/autoit] [autoit][/autoit] [autoit]$aRes = StringRegExp($sText, "\|(\d+)\|(?!=\d)", 3)
[/autoit]
_ArrayDisplay($aRes)
Wobei t.txt natürlich durch den Namen deiner Datei ersetzt werden muss in der deine Daten gespeichert sind.
Der Codeschnipsel liest jeweils die letzte, durch Pipesymbole ("|") abgegrenzte Zahl einer Zeile aus. Es war zwar nur von einer Zeile die Rede, aber jetzt hast du praktisch mehr als du wolltest.
-
Du könntest auf die NamedPipes.au3 ausweichen, die standardmäßig bei AutoIt dabei ist.
-
Ich hab mal aus den Methoden Fenstericons auszulesen die mir bekannt sind folgendes gebastelt:
Spoiler anzeigen
[autoit]#include <WindowsConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstants.au3>
#include <WinAPI.au3>;WinAPIEx.au3:
[/autoit] [autoit][/autoit] [autoit]
Global Const $GCL_CBCLSEXTRA = -20
Global Const $GCL_CBWNDEXTRA = -18
Global Const $GCL_HBRBACKGROUND = -10
Global Const $GCL_HCURSOR = -12
Global Const $GCL_HICON = -14
Global Const $GCL_HICONSM = -34
Global Const $GCL_HMODULE = -16
Global Const $GCL_MENUNAME = -8
Global Const $GCL_STYLE = -26
Global Const $GCL_WNDPROC = -24; -Author: name22 (http://www.autoit.de)
[/autoit] [autoit][/autoit] [autoit]$hWnd = GUICreate("Searching...", 256, 256)
[/autoit] [autoit][/autoit] [autoit]
GUISetState()$hDC_Window = _WinAPI_GetDC($hWnd)
[/autoit] [autoit][/autoit] [autoit]$aList = WinList()
[/autoit] [autoit][/autoit] [autoit]For $i = 1 To $aList[0][0]
[/autoit] [autoit][/autoit] [autoit]
If BitAND(WinGetState($aList[$i][1]), 3) = 3 Then
$hIcon = _SendMessage($aList[$i][1], $WM_GETICON, 2, 0, 0, Default, Default, "HANDLE")If Not $hIcon Then $hIcon = _SendMessage($aList[$i][1], $WM_GETICON, 0, 0, 0, Default, Default, "HANDLE")
[/autoit] [autoit][/autoit] [autoit]If Not $hIcon Then $hIcon = _WinAPI_GetClassLongEx($aList[$i][1], $GCL_HICON)
[/autoit] [autoit][/autoit] [autoit]If Not $hIcon Then $hIcon = _WinAPI_GetClassLongEx($aList[$i][1], $GCL_HICONSM)
[/autoit] [autoit][/autoit] [autoit]If $hIcon Then
[/autoit] [autoit][/autoit] [autoit]
WinSetTitle($hWnd, "", $aList[$i][0])
_SendMessage($hWnd, $WM_ERASEBKGND, $hDC_Window)
_WinAPI_DrawIconEx($hDC_Window, 64, 64, $hIcon, 128, 128, 0, 0, 3)
_WinAPI_DestroyIcon($hIcon)
Sleep(1000)
EndIf
EndIf
NextWhile True
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _WinAPI_GetClassLongEx
; Description....: Retrieves the specified value associated with the specified window.
; Syntax.........: _WinAPI_GetClassLongEx ( $hWnd, $iIndex )
; Parameters.....: $hWnd - Handle to the window.
; $iIndex - The value to retrieve. This parameter can be one of the following values.
;
; $GCL_CBCLSEXTRA
; $GCL_CBWNDEXTRA
; $GCL_HBRBACKGROUND
; $GCL_HCURSOR
; $GCL_HICON
; $GCL_HICONSM
; $GCL_HMODULE
; $GCL_MENUNAME
; $GCL_STYLE
; $GCL_WNDPROC
;
; Return values..: Success - The requested value.
; Failure - 0 and sets the @error flag to non-zero.
; Author.........: Yashied
; Modified.......:
; Remarks........: None
; Related........:
; Link...........: @@MsdnLink@@ GetClassLong
; Example........: Yes
; ===============================================================================================================================Func _WinAPI_GetClassLongEx($hWnd, $iIndex)
[/autoit] [autoit][/autoit] [autoit]Local $Ret
[/autoit] [autoit][/autoit] [autoit]If @AutoItX64 Then
[/autoit]
$Ret = DllCall('user32.dll', 'ulong_ptr', 'GetClassLongPtrW', 'hwnd', $hWnd, 'int', $iIndex)
Else
$Ret = DllCall('user32.dll', 'ulong', 'GetClassLongW', 'hwnd', $hWnd, 'int', $iIndex)
EndIf
If (@error) Or (Not $Ret[0]) Then
Return SetError(1, 0, 0)
EndIf
Return $Ret[0]
EndFunc ;==>_WinAPI_GetClassLongEx
Das Script liest die Icons aller offenen Fenster aus und zeigt sie nacheinander in einer GUI an. Dieses mal hab ich auch nach eukalyptus Vorschlag direkt per GDI32 gezeichnet (die Icons behalten also dank der Maske ihre Transparenz).
Es ist nicht perfekt - das Icon VLC Player wird zum Beispiel nicht korrekt ausgelesen. Allerdings funktionieren sonst praktisch alle offenen Fenster (z.B. Firefox, AIMP, Windows-Calculator, Thunderbird...).
Manche Fenster reagieren auf die WM_GETICON Nachricht, andere nicht (z.B. AutoIt GUIs)... -
Das ist durchaus möglich. Allerdings meine ich, dass sich nicht alle Icons von Fensterhandles auf die gleiche Art auslesen lassen... Ich müsste mir das mal genauer anschauen, es sei denn jemand weiß wie man das in AutoIt möglichst gut umsetzt ^^.
Man könnte natürlich auch versuchen über das Fensterhandle auf die ausführbare Datei des Prozesses zuzugreifen, aber das Icon in einem Fenster muss da nicht notwendigerweise enthalten sein. -
Praktisch
. Danke eukalyptus. Die Funktion speicher ich gleich mal ab. -
Da hast du Recht. Ich hab das auf die Schnelle zusammengebastelt, weil jemand in der SB danach gefragt hat. Ich bin mir nicht mehr ganz sicher wie Microsoft das handhabt, aber ich meine gelesen zu haben, dass zusätzlich zu den Farbinformationen eines Icons auch eine Alphamaske gespeichert wird.

-
Ich bin mir nicht sicher, ob jemand schon ein Script dieser Art gepostet hat, aber bisher sind mir nicht gerade viele Beispiele für die _WinAPI_ExtractIconEx Funktion unter die Augen gekommen.
Hier ist ein Beispiel wie man besagte Funktion verwendet um Icons aus einer Datei zu extrahieren und wie man dann mit den erhaltenen handles weiter verfahren kann (z.B. GDIPlus).
Spoiler anzeigen
[autoit]#include <WinAPI.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GDIPlus.au3>; -Author: name22 (http://www.autoit.de)
[/autoit] [autoit][/autoit] [autoit]$iStart = 3 ;0-basierter Index des ersten Icons
[/autoit] [autoit][/autoit] [autoit]
$iIcons = 5 ;Anzahl der zu extrahierenden Icons$t_ahIcons = DllStructCreate("HWND[" & $iIcons & "]") ;HWND Array um die Icons zu erhalten
[/autoit] [autoit][/autoit] [autoit]
$p_ahIcons = DllStructGetPtr($t_ahIcons)_WinAPI_ExtractIconEx(@SystemDir & "\shell32.dll", $iStart, 0, $p_ahIcons, $iIcons) ;Hier wird der pSmall Parameter verwendet um kleine Icons zu extrahieren
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]For $i = 1 To $iIcons
[/autoit] [autoit][/autoit] [autoit]
$hBitmap = _GDIPlus_BitmapCreateFromHICON(DllStructGetData($t_ahIcons, 1, $i)) ;Erzeugt aus dem HICON eine GDI+ Bitmap
_GDIPlus_ImageSaveToFile($hBitmap, @ScriptDir & StringFormat("\Icon%02d.bmp", $i)) ;Speichert die Bitmap
_GDIPlus_BitmapDispose($hBitmap) ;Bitmap löschen
_WinAPI_DestroyIcon(DllStructGetData($t_ahIcons, 1, $i)) ;Icon löschen
Next_GDIPlus_Shutdown()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name...........: _GDIPlus_BitmapCreateFromHICON
; Description ...: Creates a Bitmap object based on an icon
; Syntax.........: _GDIPlus_BitmapCreateFromHICON($hIcon)
; Parameters ....: $hIcon - Handle to an icon
; Return values .: Success - Returns a handle to a new Bitmap object
; Failure - 0 and either:
; |@error and @extended are set if DllCall failed
; |$GDIP_STATUS contains a non zero value specifying the error code
; Remarks .......: After you are done with the object, call _GDIPlus_ImageDispose to release the object resources
; Related .......: _GDIPlus_ImageDispose, _WinAPI_LoadImage, _WinAPI_LoadIcon
; Link ..........; @@MsdnLink@@ GdipCreateBitmapFromHICON
; Example .......; Yes
; ===============================================================================================================================
Func _GDIPlus_BitmapCreateFromHICON($hIcon)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromHICON", "hwnd", $hIcon, "int*", 0)If @error Then Return SetError(@error, @extended, 0)
[/autoit]
$GDIP_STATUS = $aResult[0]
Return $aResult[2]
EndFunc ;==>_GDIPlus_BitmapCreateFromHICON
Im Beispiel werden 5 Icons ab dem 3ten Index aus der shell32.dll extrahiert. Ich hoffe es kann jemand gebrauchen.
Bei Fragen bzw. Rückmeldungen meldet euch einfach ;). -
-
Alles Gute wünsche ich euch!

-
In 3.3.8.1 schon ;).
Du kannst aber einfach diese Zeile in das Script einfügen wenn du nicht updaten willst:Spoiler anzeigen
[autoit]; ===============================================================================================================================
[/autoit]
; *******************************************************************************************************************************
; GetTextMetrics Structures
; *******************************************************************************************************************************
; ===============================================================================================================================
; #STRUCTURE# ===================================================================================================================
; Name...........: $tagTEXTMETRIC
; Description ...: Contains basic information about a physical font. All sizes are specified in logical units, that is, they depend on the current mapping mode of the display context.
; Fields ........: tmHeight - Specifies the height (ascent + descent) of characters.
; tmAscent - Specifies the ascent (units above the base line) of characters.
; tmDescent - Specifies the descent (units below the base line) of characters.
; tmInternalLeading - Specifies the amount of leading (space) inside the bounds set by the tmHeight member.
; | Accent marks and other diacritical characters may occur in this area. The designer may set this member to zero.
; tmExternalLeading - Specifies the amount of extra leading (space) that the application adds between rows.
; | Since this area is outside the font, it contains no marks and is not altered by text output calls in either OPAQUE or TRANSPARENT mode.
; | The designer may set this member to zero.
; tmAveCharWidth - Specifies the average width of characters in the font (generally defined as the width of the letter x).
; | This value does not include the overhang required for bold or italic characters.
; tmMaxCharWidth - Specifies the width of the widest character in the font.
; tmWeight - Specifies the weight of the font.
; tmOverhang - Specifies the extra width per string that may be added to some synthesized fonts.
; | When synthesizing some attributes, such as bold or italic, graphics device interface (GDI) or a device may have to add width to a string on both a per-character and per-string basis.
; | For example, GDI makes a string bold by expanding the spacing of each character and overstriking by an offset value
; | it italicizes a font by shearing the string. In either case, there is an overhang past the basic string.
; | For bold strings, the overhang is the distance by which the overstrike is offset. For italic strings, the overhang is the amount the top of the font is sheared past the bottom of the font.
; | The tmOverhang member enables the application to determine how much of the character width returned by a GetTextExtentPoint32 function call on a single character is the actual character width and how much is the per-string extra width.
; | The actual width is the extent minus the overhang.
; tmDigitizedAspectX - Specifies the horizontal aspect of the device for which the font was designed.
; tmDigitizedAspectY - Specifies the vertical aspect of the device for which the font was designed.
; | The ratio of the tmDigitizedAspectX and tmDigitizedAspectY members is the aspect ratio of the device for which the font was designed.
; tmFirstChar - Specifies the value of the first character defined in the font.
; tmLastChar - Specifies the value of the last character defined in the font.
; tmDefaultChar - Specifies the value of the character to be substituted for characters not in the font.
; tmBreakChar - Specifies the value of the character that will be used to define word breaks for text justification.
; tmItalic - Specifies an italic font if it is nonzero.
; tmUnderlined - Specifies an underlined font if it is nonzero.
; tmStruckOut - Specifies a strikeout font if it is nonzero.
; tmPitchAndFamily - Specifies information about the pitch, the technology, and the family of a physical font.
; The four low-order bits of this member specify information about the pitch and the technology of the font. A constant is defined for each of the four bits.
; $TMPF_FIXED_PITCH If this bit is set the font is a variable pitch font. If this bit is clear the font is a fixed pitch font. Note very carefully that those meanings are the opposite of what the constant name implies.
; $TMPF_VECTOR If this bit is set the font is a vector font.
; $TMPF_TRUETYPE If this bit is set the font is a TrueType font.
; $TMPF_DEVICE If this bit is set the font is a device font.
; tmCharSet - Specifies the character set of the font. The character set can be one of the following values.
; |ANSI_CHARSET
; |BALTIC_CHARSET
; |CHINESEBIG5_CHARSET
; |DEFAULT_CHARSET
; |EASTEUROPE_CHARSET
; |GB2312_CHARSET
; |GREEK_CHARSET
; |HANGUL_CHARSET
; |MAC_CHARSET
; |OEM_CHARSET
; |RUSSIAN_CHARSET
; |SHIFTJIS_CHARSET
; |SYMBOL_CHARSET
; |TURKISH_CHARSET
; |VIETNAMESE_CHARSET
; Author ........: Gary Frost
; Remarks .......:
; ===============================================================================================================================
Global Const $tagTEXTMETRIC = "long tmHeight;long tmAscent;long tmDescent;long tmInternalLeading;long tmExternalLeading;" & _
"long tmAveCharWidth;long tmMaxCharWidth;long tmWeight;long tmOverhang;long tmDigitizedAspectX;long tmDigitizedAspectY;" & _
"wchar tmFirstChar;wchar tmLastChar;wchar tmDefaultChar;wchar tmBreakChar;byte tmItalic;byte tmUnderlined;byte tmStruckOut;" & _
"byte tmPitchAndFamily;byte tmCharSet" -
misterspeed
$tagTEXTMETRIC müsste in der StructureConstants.au3 definiert sein. Die sollte durch "GUIEdit.au3 <- WinAPI.au3 <- StructureConstants.au3" ins Script kommen. -
Ich würde empfehlen als Flag für BinaryToString 4 (UTF-8 encoding) zu verwenden. Nicht alle Zeichen im Quellcode sind ANSI Zeichen...
[autoit]$Var = BinaryToString(InetRead("URL", 19), 4)
[/autoit]