Alles Gute und Danke für deine großartige Arbeit!
Beiträge von eukalyptus
-
-
Meinst du so was?
[ offen ] Programm.exe in einem AutoIt fenster ausführen -
Hi
Zunächst mal benötigst du GDIp.au3: http://www.autoitscript.com/forum/topic/106021-gdipau3/
Darin findest du die Funktion _GDIPlus_GraphicsSetPageUnit.Ich würde es in etwa so machen:
Ein Backbuffer in der Größe des Fensters in Pixel Units
Eine eigene Grafik in Milimeter Units zum zeichnenSpoiler anzeigen
[autoit]#include <GDIP.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$hGui = GUICreate("A4", 210, 297)
[/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent(-3, "_Exit")_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
$hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics(210, 297, $hGraphics) ;Backbuffer verhindert flackern
$hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
_GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)$aSize = _CalcBitmapSize(210, 297) ;Wie groß ist das in Pixel?
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite($aSize[0] & " " & $aSize[1] & @CRLF)
$hBmpMilimeter = _GDIPlus_BitmapCreateFromGraphics($aSize[0], $aSize[1], $hGraphics)
$hGfxMilimeter = _GDIPlus_ImageGetGraphicsContext($hBmpMilimeter)
_GDIPlus_GraphicsSetPageUnit($hGfxMilimeter, 6)
_GDIPlus_GraphicsClear($hGfxMilimeter, 0xFFFFFFFF)$hPen = _GDIPlus_PenCreate(0xFF000000, 4)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawRect($hGfxMilimeter, 1, 1, 208, 295, $hPen) ;Zeichnen in Millimeter_GDIPlus_ImageSaveToFile($hBmpMilimeter, @ScriptDir & "\A4.bmp") ;Speichern - Zieldatei sollte A4 Größe haben
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_GraphicsDrawImageRect($hGfxBuffer, $hBmpMilimeter, 0, 0, 210, 297) ;zeichne Milimetergrafik verkleinert auf Backbuffer
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg($WM_PAINT, "WM_PAINT")
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
GUISetState()While 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Sleep(100)
WEndFunc _CalcBitmapSize($iW, $iH)
[/autoit] [autoit][/autoit] [autoit]
Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
Local $aPoints[2][2]
$aPoints[0][0] = 1
$aPoints[1][0] = $iW
$aPoints[1][1] = $iH_GDIPlus_GraphicsSetPageUnit($hGraphics, 6)
[/autoit] [autoit][/autoit] [autoit]
Local $aResult = _GDIPlus_GraphicsTransformPoints($hGraphics, $aPoints, 2, 1)_GDIPlus_GraphicsDispose($hGraphics)
[/autoit] [autoit][/autoit] [autoit]Local $aReturn[2]
[/autoit] [autoit][/autoit] [autoit]
$aReturn[0] = Ceiling($aResult[1][0])
$aReturn[1] = Ceiling($aResult[1][1])Return $aReturn
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>_CalcBitmapSizeFunc WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_PAINTFunc _Exit()
[/autoit]
_GDIPlus_PenDispose($hPen)
_GDIPlus_GraphicsDispose($hGfxMilimeter)
_GDIPlus_BitmapDispose($hBmpMilimeter)
_GDIPlus_GraphicsDispose($hGfxBuffer)
_GDIPlus_BitmapDispose($hBmpBuffer)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()
Exit
EndFunc ;==>_ExitE
-
-
Dann hast du bisher immer GuiGetMsg verwendet, welches intern ein Sleep macht, wenn die Maus nicht bewegt wird...
[autoit]
selbst dieses Script:While 1
[/autoit]
WEndhat etwa 50% bei mir
-
Das liegt nicht an GDI+, du brauchst nur ein Sleep(10) in der Schleife
-
Habs jetzt auch nicht ausprobiert, aber wenn man mehrere Scripte hat, reicht 1 Kompilierte Exe, von der aus die anderen Scripte gestartet werden können
[autoit]Run(@AutoItExe & ' /AutoIt3ExecuteScript Script1.au3'
[/autoit] -
Sowas ist mir nicht bekannt.
Welche CPU-Auslastung hat denn dein Script? -
Du kannst z.B. mit _GDIPlus_GraphicsSetInterpolationMode (GDIp.au3) oder _GDIPlus_GraphicsSetSmoothingMode schnellere Algorithmen einstellen.
Meinst du das? -
Du musst zuerst die Matrix zum Drehmittelpunkt verschieben, dann Drehen und dann wieder zurückverschieben
[autoit]_GDIPlus_MatrixTranslate($hMatrix, $iWidth / 2, $iHeight / 2)
[/autoit]
_GDIPlus_MatrixRotate($hMatrix, $iAngle)
_GDIPlus_MatrixTranslate($hMatrix, -$iWidth / 2, -$iHeight / 2)E
-
hätte jetz nicht gedacht, dass das "löschen" von gezeichneten linien so kompliziert sein würde...
Betrachte GDI+ wie ein Grafikprogramm. Wenn du z.B. in MSPaint ein Foto hast und einen roten Strich drauf malst, wie löschst du diesen, ohne die "Rückgangig" Funktion zu benutzen?
Nimm für den Anfang keine transparenten Fenster und werde mit den einfachen Zeichenfunktionen (DrawLine, FillRect, DrawImage...) vertraut.
Dann mach ein paar Versuche mit Backbuffer und RegisterMsg ($WM_PAINT)Hier ein gutes Tutorial: Gdi+ Tutorial [Part 5]
Um GDI+ auf LayeredWindows zu benutzen, bedarf es schon eines gewissen Grundverständnisses und gehört schon eher zum Expertenlevel.
Deshalb mach mal das Tutorial durch und versuch dich dann an einfachen Spielen wie Pong oder SnakeE
-
$iWidth und $iHeight geben einfach die Größe des Fensters an
Und sind in diesem Fall das gleiche wie @DesktopWidth bzw. @DesktopHeightVielleicht solltest du zuerst mit etwas leichterem üben, bevor du dich über so ein schwieriges Script hermachst

-
Ich mach das immer mit einem Label hinter der Grafik.
[autoit]
Damit das Label die Grafik nicht stört, muss man SS_OwnerDraw Style angebenGUICtrlCreateLabel("", X, Y, W, H, 0x0000000D)
[/autoit]Und mit GuiCtrlSetOnEvent kann man dann die gewünschte Funktion zuweisen
E
-
Rein theoretisch musst du nur in der Farbe 0xFFABCDEF den alten Strich übermalen.
Das klappt jedoch nicht immer. Wenn ich mich recht erinnere, dann geht das zwar mit FillRect, aber nicht mit FillEllipse oder DrawLine!
GraphicsClear scheint auch nicht zu funktionieren... so als ob Windows nicht immer 100% die richtige Farbe erwischt
Probier mal das hier:
Spoiler anzeigen
[autoit]#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <WinAPI.au3>
#include <WindowsConstants.au3>HotKeySet("{ESC}", "_Exit")
[/autoit] [autoit][/autoit] [autoit]$iWidth = @DesktopWidth
[/autoit] [autoit][/autoit] [autoit]
$iHeight = @DesktopHeight_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$hGui = GUICreate("", $iWidth, $iHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TRANSPARENT))
[/autoit] [autoit][/autoit] [autoit]
GUISetState()$aMPos_Old = MouseGetPos()
[/autoit] [autoit][/autoit] [autoit]While Sleep(10)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$aMPos = MouseGetPos()
If $aMPos[0] <> $aMPos_Old[0] Or $aMPos[1] <> $aMPos_Old[1] Then
_UpdateWindow($hGui, $iWidth, $iHeight, $aMPos)
$aMPos_Old = $aMPos
EndIf
WEndFunc _UpdateWindow($hWnd, $iW, $iH, $aMPos)
[/autoit] [autoit][/autoit] [autoit]
Local $tSize = DllStructCreate("long X;long Y")
DllStructSetData($tSize, "X", $iW)
DllStructSetData($tSize, "Y", $iH)Local $tSource = DllStructCreate("long X;long Y")
[/autoit] [autoit][/autoit] [autoit]Local $tBlendI = DllStructCreate("byte Op;byte Flags;byte Alpha;byte Format")
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tBlendI, "Alpha", 0xFF)
DllStructSetData($tBlendI, "Format", 1)Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)
[/autoit] [autoit][/autoit] [autoit]
Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGraphics)
Local $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)$hPen = _GDIPlus_PenCreate(0xFFFF0000, 2)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawLine($hContext, $iW / 2, $iH / 2, $aMPos[0], $aMPos[1], $hPen)Local $hDC = _WinAPI_GetDC($hWnd)
[/autoit] [autoit][/autoit] [autoit]
Local $hDCS = _WinAPI_CreateCompatibleDC($hDC)
Local $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
Local $hOrig = _WinAPI_SelectObject($hDCS, $hBmp)_WinAPI_UpdateLayeredWindow($hWnd, $hDC, 0, DllStructGetPtr($tSize), $hDCS, DllStructGetPtr($tSource), 0, DllStructGetPtr($tBlendI), 2)
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_PenDispose($hPen)
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_GraphicsDispose($hContext)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hGraphics)_WinAPI_SelectObject($hDCS, $hOrig)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_WinAPI_DeleteObject($hBmp)
_WinAPI_ReleaseDC($hWnd, $hDC)
EndFunc ;==>_UpdateWindowFunc _Exit()
[/autoit]
_GDIPlus_Shutdown()
GUIDelete($hGui)
Exit
EndFunc ;==>_Exit -
Es funktioniert übrigens auch so:
[autoit]_GDIPlus_GraphicsDrawImageRectRect($buffer, $bk, $x, $y, 431, 400, 0, 0, 832, 800)
[/autoit]Hier das Beispiel, was genau _GDIPlus_GraphicsDrawImageRectRect macht:
Cursortasten zum bewegen; F1 - F4 zum ändern der GrößeSpoiler anzeigen
[autoit]#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]$iX = 0
[/autoit] [autoit][/autoit] [autoit]
$iY = 0
$iW = 100
$iH = 100HotKeySet("{UP}", "_Move")
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
HotKeySet("{DOWN}", "_Move")
HotKeySet("{LEFT}", "_Move")
HotKeySet("{RIGHT}", "_Move")
HotKeySet("{F1}", "_Size")
HotKeySet("{F2}", "_Size")
HotKeySet("{F3}", "_Size")
HotKeySet("{F4}", "_Size")_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\back.png")
[/autoit] [autoit][/autoit] [autoit]$hGui_SRC = GUICreate("Quelle", 431, 400, 0, 0)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
$hGFX_SRC = _GDIPlus_GraphicsCreateFromHWND($hGui_SRC)
$hBMP_SRC_Buf = _GDIPlus_BitmapCreateFromGraphics(431, 400, $hGFX_SRC)
$hGFX_SRC_Buf = _GDIPlus_ImageGetGraphicsContext($hBMP_SRC_Buf)
GUISetState()$hGui_DST = GUICreate("Ziel", 200, 200, 450, 0)
[/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
$hGFX_DST = _GDIPlus_GraphicsCreateFromHWND($hGui_DST)
$hBMP_DST_Buf = _GDIPlus_BitmapCreateFromGraphics(200, 200, $hGFX_DST)
$hGFX_DST_Buf = _GDIPlus_ImageGetGraphicsContext($hBMP_DST_Buf)
GUISetState()$hPen = _GDIPlus_PenCreate(0xFFFF4040, 1)
[/autoit] [autoit][/autoit] [autoit]
_Draw()While 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Sleep(100)
WEndFunc _Draw()
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsClear($hGFX_SRC_Buf, 0xFF000000)
_GDIPlus_GraphicsDrawImage($hGFX_SRC_Buf, $hImage, 0, 0)
_GDIPlus_GraphicsDrawRect($hGFX_SRC_Buf, $iX, $iY, $iW, $iH, $hPen)
_GDIPlus_GraphicsDrawImage($hGFX_SRC, $hBMP_SRC_Buf, 0, 0)_GDIPlus_GraphicsClear($hGFX_DST_Buf, 0xFF000000)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawImageRectRect($hGFX_DST_Buf, $hImage, $iX, $iY, $iW, $iH, 0, 0, 200, 200)
_GDIPlus_GraphicsDrawImage($hGFX_DST, $hBMP_DST_Buf, 0, 0)
EndFunc ;==>_DrawFunc _Move()
[/autoit] [autoit][/autoit] [autoit]
Switch @HotKeyPressed
Case "{UP}"
$iY -= 1
Case "{DOWN}"
$iY += 1
Case "{LEFT}"
$iX -= 1
Case "{RIGHT}"
$iX += 1
EndSwitch
_Draw()
EndFunc ;==>_MoveFunc _Size()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Switch @HotKeyPressed
Case "{F1}"
$iW -= 1
Case "{F2}"
$iW += 1
Case "{F3}"
$iH -= 1
Case "{F4}"
$iH += 1
EndSwitch
_Draw()
EndFunc ;==>_SizeFunc _Exit()
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_PenDispose($hPen)_GDIPlus_ImageDispose($hImage)
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_GraphicsDispose($hGFX_DST_Buf)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_BitmapDispose($hBMP_DST_Buf)
_GDIPlus_GraphicsDispose($hGFX_DST)_GDIPlus_GraphicsDispose($hGFX_SRC_Buf)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_BitmapDispose($hBMP_SRC_Buf)
_GDIPlus_GraphicsDispose($hGFX_SRC)_GDIPlus_Shutdown()
[/autoit]
Exit
EndFunc ;==>_ExitE
-
So besser?:
[autoit]_GDIPlus_GraphicsDrawImageRectRect($buffer, $bk, 0, 0, 431, 400, -$x, -$y, 832, 800)
[/autoit]Übrigens, das Bild wird nicht gestaucht, es sieht nur so aus, weil vom letzen Schleifendurchlauf noch "Bild Reste" übrig sind
[autoit]
lösch am besten immer den Buffer mit_GDIPlus_GraphicsClear($buffer, 0xFF000000)
[/autoit]E
-
Damit keine Missverständnisse aufkommen - von den Dll´s ist nur BassExt.dll von mir; alle anderen sind vom Un4Seen-Team (un4seen.com)
Die Bass-UDF für AutoIt ist von BrettF, Prog@ndy und mirE
-
Hier ein Beispielscript eines 31-Band EQs
Spoiler anzeigen
[autoit]#include "Bass.au3"
[/autoit] [autoit][/autoit] [autoit]
#include "BassExt.au3"
#include "BassFX.au3"
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#AutoIt3Wrapper_UseX64=nOpt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]$hGui = GUICreate("31 Band EQ", 1105, 350)
[/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
$hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics(1085, 100, $hGraphics)
$hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
_GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)
$hBrush = _GDIPlus_BrushCreateSolid(0xFF00FF00)_BASS_Startup()
[/autoit] [autoit][/autoit] [autoit]
_BASS_FX_Startup()
_BASS_EXT_Startup()
_BASS_Init(0, -1, 44100, 0, "")
_BASS_RecordInit(-1)$hStream = _BASS_StreamCreate(44100, 2, 0, $STREAMPROC_PUSH, 0)
[/autoit] [autoit][/autoit] [autoit]$aPipe = _BASS_EXT_StreamPipeCreate($hStream, $BASS_EXT_STREAMPROC_PUSH)
[/autoit] [autoit][/autoit] [autoit]
_BASS_ChannelPlay($hStream, True)$hRecord = _BASS_RecordStart(44100, 2, 0, $BASS_EXT_RecordProc, $aPipe[0])
[/autoit] [autoit][/autoit] [autoit]$aFreq = StringSplit("20,25,31.5,40,50,63,80,100,125,160,200,250,315,400,500,630,800,1000,1250,1600,2000,2500,3150,4000,5000,6300,8000,10000,12500,16000,20000", ",")
[/autoit] [autoit][/autoit] [autoit]
Global $aFX[$aFreq[0] + 1]
Global $aSlider[$aFreq[0] + 1][2]$iBW = 0.5
[/autoit] [autoit][/autoit] [autoit]For $i = 1 To $aFreq[0]
[/autoit] [autoit][/autoit] [autoit]
$aFX[$i] = _BASS_ChannelSetFX($hRecord, $BASS_FX_BFX_BQF, $i)
_BASS_FXSetParameters($aFX[$i], $BASS_BFX_BQF_PEAKINGEQ & "|" & $aFreq[$i] & "|0|" & $iBW & "|0|0|" & $BASS_BFX_CHANALL)
GUICtrlCreateLabel(_FormatHz($aFreq[$i]), ($i - 1) * 35 + 10, 10, 35, 20, 1)
$aSlider[$i][0] = GUICtrlCreateSlider(($i - 1) * 35 + 10, 30, 28, 200, 10)
$aSlider[$i][1] = GUICtrlGetHandle($aSlider[$i][0])
GUICtrlSetLimit(-1, 150, -150)
GUICtrlSetOnEvent(-1, "_SetEQ")
Next$aFFT = _BASS_EXT_CreateFFT(96, 0, 0, 1085, 100, 2, True)
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
GUISetState()While 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)
_BASS_EXT_ChannelGetFFT($hStream, $aFFT, 6)
If Not @error Then DllCall($ghGDIPDll, "int", "GdipFillPolygon", "handle", $hGfxBuffer, "handle", $hBrush, "ptr", $aFFT[0], "int", $aFFT[1], "int", "FillModeAlternate")
_GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 10, 240)
Sleep(20)
WEndFunc _SetEQ()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Local $iPos = GUICtrlRead(@GUI_CtrlId) / - 10
For $i = 1 To $aFreq[0]
If @GUI_CtrlId = $aSlider[$i][0] Then
_BASS_FXSetParameters($aFX[$i], $BASS_BFX_BQF_PEAKINGEQ & "|" & $aFreq[$i] & "|" & $iPos & "|" & $iBW & "|0|0|" & $BASS_BFX_CHANALL)
ToolTip($aFreq[$i] & "Hz " & $iPos & "dB")
Return
EndIf
Next
EndFunc ;==>_SetEQFunc WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Local $iCode = BitAND($wParam, 0x0000FFFF)
Local $iPos = BitShift($wParam, 16) / - 10
Local $iHi, $iLo
If $iCode = 5 Then
For $i = 1 To $aFreq[0]
If $lParam = $aSlider[$i][1] Then
_BASS_FXSetParameters($aFX[$i], $BASS_BFX_BQF_PEAKINGEQ & "|" & $aFreq[$i] & "|" & $iPos & "|" & $iBW & "|0|0|" & $BASS_BFX_CHANALL)
ToolTip($aFreq[$i] & "Hz " & $iPos & "dB")
Return $GUI_RUNDEFMSG
EndIf
Next
EndIf
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_VSCROLLFunc _FormatHz($iHz)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Local $ikHz = Floor($iHz / 1000)
If $ikHz > 0 Then
$iHz = Mod($iHz, 1000)
Return $ikHz & "k" & StringReplace($iHz, "0", "")
Else
Return $iHz
EndIf
EndFunc ;==>_FormatHzFunc _Exit()
[/autoit]
_BASS_RecordFree()
_BASS_StreamFree($hStream)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hGfxBuffer)
_GDIPlus_BitmapDispose($hBmpBuffer)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()
Exit
EndFunc ;==>_ExitDas Ergebnis klingt jedoch nicht ganz sauber.
Man müsste einen größeren Buffer verwenden, aber dann steigt die Latenz!
Oder man verwendet BassAsio - dazu muss die Soundkarte jedoch einen Asiotreiber haben...
Ein Beispiel zu Asio findest du in der Bass-Hilfe unter "_BASS_ASIO_ChannelEnable" - _BASS_ChannelSetFX kann dort genauso angewendet werden, wie hier.E
-
Hier die Möglichkeit via Bass.dll: [ gelöst ] bass.dll frage zu datei speichern
-
Hab gar nicht mehr gewusst, daß ich die MemoryBuffer-Funktion bereits in die DownloadProc integriert hatte...

so gehts:
Spoiler anzeigen
[autoit]#AutoIt3Wrapper_UseX64=n
[/autoit] [autoit][/autoit] [autoit]
#include "Bass.au3"
#include "BassExt.au3"HotKeySet("{ESC}", "_Exit")
[/autoit] [autoit][/autoit] [autoit]_BASS_Startup()
[/autoit] [autoit][/autoit] [autoit]
_BASS_Ext_Startup()
_BASS_Init(0, -1, 44100, 0, "")$tBuffer = DllStructCreate("byte[10000000]")
[/autoit] [autoit][/autoit] [autoit]
$pBuffer = DllStructGetPtr($tBuffer)
$iBuffer = DllStructGetSize($tBuffer)$aMP3Buffer = _BASS_EXT_MemoryBufferCreate()
[/autoit] [autoit][/autoit] [autoit]$hStream = _BASS_StreamCreateURL("http://dc370.4shared.com/img/777213322/c38560ec/dlink__2Fdownload_2F2v7poYoy_3Ftsid_3D20110910-35650-7cd66ec0/preview.mp3", _
[/autoit] [autoit][/autoit] [autoit]
0, $BASS_STREAM_DECODE, $BASS_EXT_DownloadProc, $aMP3Buffer[0]) ;use callback function from bassext.dll$iLength = _BASS_ChannelGetLength($hStream, $BASS_POS_BYTE)
[/autoit] [autoit][/autoit] [autoit]
$iBytes = 0While $iBytes < $iLength
[/autoit] [autoit][/autoit] [autoit]
$iBytes += _BASS_ChannelGetData($hStream, $pBuffer, $iBuffer)
ToolTip(Round($iBytes * 100 / $iLength, 1) & "%" & @CRLF & "MP3 Daten in Buffer: " & Round(_BASS_EXT_MemoryBufferGetSize($aMP3Buffer) / 1024, 1) & "KB")
Sleep(500)
WEnd$iSize = _BASS_EXT_MemoryBufferGetSize($aMP3Buffer)
[/autoit] [autoit][/autoit] [autoit]
$bMP3Data = _BASS_EXT_MemoryBufferGetData($aMP3Buffer, $iSize)$hFile = FileOpen(@ScriptDir & "\Download.mp3", 18)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
FileWrite($hFile, $bMP3Data)
FileClose($hFile)_Exit()
[/autoit] [autoit][/autoit] [autoit]Func _Exit()
[/autoit]
_BASS_StreamFree($hStream)
_BASS_EXT_MemoryBufferDestroy($aMP3Buffer)
_BASS_Free()
Exit
EndFunc ;==>_ExitE