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. eukalyptus

Beiträge von eukalyptus

  • bmp 2 jpg konvertieren

    • eukalyptus
    • 14. August 2011 um 19:33

    Da es um die Geschwindigkeit geht, würde ich das so machen:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <GDIPlus.au3>
    #include <GDIPlusConstants.au3>
    #include <WinAPI.au3>

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

    _GDIPlus_Startup()

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

    Global $tGUID = _WinAPI_GUIDFromString("{557CF401-1A04-11D3-9A73-0000F81EF32E}")
    Global $pGUID = DllStructGetPtr($tGUID)

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

    Global $tParams = _GDIPlus_ParamInit(1)
    Global $pParams = DllStructGetPtr($tParams)
    Global $tData = DllStructCreate("int Quality")
    DllStructSetData($tData, "Quality", 50)
    _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, DllStructGetPtr($tData))

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

    Global $aFiles = _FileListToArray(@ScriptDir & "\BMP\", "*.bmp")
    Global $iTimer = TimerInit()
    For $i = 1 To $aFiles[0]
    _ConvertBMP2JPG(@ScriptDir & "\BMP\" & $aFiles[$i])
    Next
    ConsoleWrite(TimerDiff($iTimer) & @CRLF)
    _GDIPlus_Shutdown()

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

    Func _ConvertBMP2JPG($sFileName)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipLoadImageFromFile", "wstr", $sFileName, "ptr*", 0)
    DllCall($ghGDIPDll, "int", "GdipSaveImageToFile", "handle", $aResult[2], "wstr", StringTrimRight($sFileName, 3) & "jpg", "ptr", $pGUID, "ptr", $pParams)
    DllCall($ghGDIPDll, "int", "GdipDisposeImage", "handle", $aResult[2])
    EndFunc ;==>_ConvertBMP2JPG

    [/autoit]

    Diese Variante ist fast genauso schnell wie FreeImage.dll und mehr als doppelt so schnell wie Convert.exe (ImageMagic)
    Das sollte doch ausreichen, oder ;)

    Edit: Falls du FreeImage testen willst, das wäre die Funktion dafür:

    [autoit]

    Func _ConvertBMP2JPG_FreeImage($sFileName)
    Local $aResult = DllCall($hDll, "ptr", "_FreeImage_Load@12", "int", 0, "str", $sFileName, "int", 0)
    DllCall($hDll,"int", "_FreeImage_Save@16", "int", 2, "ptr", $aResult[0], "str", StringTrimRight($sFileName,3) & "jpg", "int", 50)
    DllCall($hDll, "none", "_FreeImage_Unload@4", "ptr", $aResult[0])
    EndFunc

    [/autoit]
  • Multi Auto Installer

    • eukalyptus
    • 4. August 2011 um 10:28

    Hab mir den Code kurz angesehen...

    Control-Handle findest du im Array "$aWin" in der Funktion _GetInfo und zwar in der 2 Spalte (_Arraydisplay)
    Ich schlage vor, du startest ein neues Projekt und übernimmst nur die Funktionen _ProcessGetChildren und _WinGetControls und schreibst dann deine KI dazu, anstatt diesen unübersichtlichen Code zu verändern

    E

  • Kleines Problem beim filtern von Arrays

    • eukalyptus
    • 3. August 2011 um 08:19

    Hi

    Du erstellst jedesmal in der Schleife die Globale Variable neu - das sollte im gesammten Script jedoch nur indgesammt 1 Mal geschehen.
    Auch kannst du den Inhalt der Listbox löschen, anstatt des ganzen Controls (und wieder neu erzeugen).

    Ich würde das in etwa so machen:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    Global $oDict_List = ObjCreate('Scripting.Dictionary')
    If Not IsObj($oDict_List) Then
    MsgBox(0, "ERROR", "creating scripting.dictionary object failed")
    Exit
    EndIf
    $oDict_List.CompareMode = 1

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

    Global $oDict_System = ObjCreate('Scripting.Dictionary')
    If Not IsObj($oDict_System) Then
    MsgBox(0, "ERROR", "creating scripting.dictionary object failed")
    Exit
    EndIf
    $oDict_System.CompareMode = 1
    $oDict_System.Add('svchost.exe', 1)
    $oDict_System.Add('smss.exe', 1)
    $oDict_System.Add('dllhost.exe', 1)
    $oDict_System.Add('dwm.exe', 1)
    $oDict_System.Add('spoolsv.exe', 1)
    $oDict_System.Add('csrss.exe', 1)
    $oDict_System.Add('winlogon.exe', 1)

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

    Opt("GUIOnEventMode", 1)

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

    Global $hGui = GUICreate("Process Inspector", 528, 258 + 25)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $cList = GUICtrlCreateList("", 2, 2, 524, 262)
    Global $cButtonRefresh = GUICtrlCreateButton("Refresh", 30, 260, 462, 20)
    GUICtrlSetOnEvent($cButtonRefresh, "_Refresh")
    GUISetState()

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

    While 1
    Sleep(100)
    WEnd

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

    Func _Refresh()
    Local $aProcess = ProcessList()
    If @error Or Not IsArray($aProcess) Then Return False
    $oDict_List.RemoveAll
    For $i = 1 To $aProcess[0][0]
    If $oDict_System.Exists($aProcess[$i][0]) Then ContinueLoop
    If Not $oDict_List.Exists($aProcess[$i][0]) Then $oDict_List.Add($aProcess[$i][0], $aProcess[$i][0])
    Next
    GUICtrlSetData($cList, "")
    For $i In $oDict_List.Keys()
    GUICtrlSetData($cList, "Process: " & $i)
    Next
    EndFunc ;==>_Refresh

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Die Scripting.Dictionary-Objekte arbeiten schneller, als wenn man ein normales Array durchgehen muß - besonders, wenn die Liste immer länger wird

    E

  • Multi Auto Installer

    • eukalyptus
    • 3. August 2011 um 07:55

    Sowas habe ich mal probiert, aber nach kurzer Zeit wieder aufgegeben.
    (u.a. aus den Gründen, die Chip oben dargelegt hat)

    UniversalInstaller

    Vielleicht ist das ja ein Ansatz

  • BASS.DLL Windows 7 64-Bit aktueller Audio Pegel

    • eukalyptus
    • 1. August 2011 um 23:44

    Es ist nicht möglich den Audio-Datenstrom von einem Fremdprogramm direkt auszulesen.

    Aber 2 Möglichkeiten gibt es doch

    1) Einen virtuellen Sountkartentreiber, der quasi zwischen Programm und richtiger Soundkarte sitzt (z.B.: VLC -> Virtueller Treiber -> Soundkartentreiber)
    Von diesem lassen sich dann die gewünschten Daten auslesen.
    Ich glaube "Virtual Audio Cable" ist sowas; vielleicht gibt es auch eine Freewarevariante...
    (oder du bist gut genug in einer höheren Programmiersprache, um selber einen virtuellen Treiber zu schreiben ;))

    2) Bei manchen Soundkarten kann man den Output direkt auf den Input patchen. Nennt sich meistens "StereoMix" oder "What you hear", einfach im Windows-Mixer das Häkchen setzen...
    Mit Bass.dll kann man den Input dann aufnehmen und analysieren.
    Die Lautstärke ist jedoch abhängig von den Reglereinstellungen im Windowsmixer

    E

  • Allgemeine Frage zu Hex und Dec

    • eukalyptus
    • 26. Juli 2011 um 07:17

    Du kannst mit Hex-Werten rechnen, die in ein 32Bit signed Integer passen, also von -2^31 bis 2^31-1
    weiters verlangt Dec einen Hex-String ohne Prefix
    Dec(0xFFFFFFFF) wäre dasselbe wie Dec(-1) und das ergibt 0, weil Error

    [autoit]

    ConsoleWrite("-=========================================" & @CRLF)
    _Hex(0)
    _Hex(-1)
    _Hex(1)
    _Hex(-2 ^ 31)
    _Hex(2 ^ 31 - 1)
    _Hex(-2147483648 - 1)
    _Hex(2147483647 + 1)
    ConsoleWrite("-=========================================" & @CRLF)
    _Dec("00000000")
    _Dec("FFFFFFFF")
    _Dec("00000001")
    _Dec("80000000")
    _Dec("7FFFFFFF")
    _Dec("FFFFFFFFF")
    _Dec(0xFFFFFFFF)
    ConsoleWrite("-=========================================" & @CRLF)

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

    Func _Hex($Val)
    Local $Hex = Hex($Val)
    Local $Dec = Dec($Hex)
    If $Dec = $Val Then
    ConsoleWrite("+ " & $Val & @TAB & " => " & $Hex & @TAB & " => " & $Dec & @CRLF)
    Else
    ConsoleWrite("! " & $Val & @TAB & " => " & $Hex & @TAB & " => " & $Dec & @CRLF)
    EndIf
    EndFunc ;==>_Hex

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

    Func _Dec($Val)
    Local $Dec = Dec($Val)
    Local $Hex = Hex($Dec)
    If $Hex = $Val Then
    ConsoleWrite("+ " & $Val & @TAB & " => " & $Dec & @TAB & " => " & $Hex & @CRLF)
    Else
    ConsoleWrite("! " & $Val & @TAB & " => " & $Dec & @TAB & " => " & $Hex & @CRLF)
    EndIf
    EndFunc ;==>_Dec

    [/autoit]
  • au15k - Skriptwettbewerb - Fertig -

    • eukalyptus
    • 22. Juli 2011 um 11:11

    Ich reiche auch ein Script ein:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)

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

    Global $iWidth = 400;@DesktopWidth
    Global $iHeight = 400;@DesktopHeight

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

    Global $fRX = 0.1
    Global $fRY = 1.5
    Global $fRZ = -0.3

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

    Global Const $PI = ATan(1) * 4
    Global Const $PI2 = $PI * 2
    Global Const $Deg2Rad = $PI / 180
    Global Const $Rad2Deg = 180 / $PI

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

    _GDIPlus_Startup()
    Global $hGui = GUICreate("3D Test by Eukalyptus", $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    Global $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)

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

    Global $hBmpScale = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    Global $hGfxScale = _GDIPlus_ImageGetGraphicsContext($hBmpScale)
    _GDIPlus_GraphicsClear($hGfxScale, 0xFF000000)
    Global $fScale = 0.02
    DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "hwnd", $hGfxScale, "int", 0)
    DllCall($ghGDIPDll, "uint", "GdipTranslateWorldTransform", "hwnd", $hGfxScale, "float", -($iWidth / 2 * $fScale), "float", -($iHeight / 2 * $fScale), "int", 0)
    DllCall($ghGDIPDll, "uint", "GdipScaleWorldTransform", "hwnd", $hGfxScale, "float", 1 + $fScale, "float", 1 + $fScale, "int", 0)

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

    Global $hPenBG = _GDIPlus_PenCreate(0xFF005500, 1)
    Global $hPenFG = _GDIPlus_PenCreate(0xFF00FF00, 2)
    DllCall($ghGDIPDll, "uint", "GdipSetPenLineJoin", "hwnd", $hPenFG, "int", 2)
    Global $hPenGL = _GDIPlus_PenCreate(0x2400AAFF, 1)
    Global $hBrush = _GDIPlus_BrushCreateSolid(0x30000000)

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUIRegisterMsg($WM_ERASEBKGND, "WM_ERASEBKGND")

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

    GUISetState()

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

    GUICreate("Rotate", 200, 100, 0, 0, -1, -1, $hGui)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $cSliderX = GUICtrlCreateSlider(10, 10, 180, 30)
    GUICtrlSetData(-1, 50 + ($fRX * 10))
    GUICtrlSetOnEvent(-1, "_SetRotate")
    Global $cSliderY = GUICtrlCreateSlider(10, 40, 180, 30)
    GUICtrlSetData(-1, 50 + ($fRY * 10))
    GUICtrlSetOnEvent(-1, "_SetRotate")
    Global $cSliderZ = GUICtrlCreateSlider(10, 70, 180, 30)
    GUICtrlSetData(-1, 50 + ($fRZ * 10))
    GUICtrlSetOnEvent(-1, "_SetRotate")
    GUISetState()

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

    Global $aPnt = _CreateBall("GDI+ AutoIt Script|3D Text-Ball|by Eukalyptus", 0.65, 0.25, $iWidth, $iHeight, 0.7)

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

    While 1
    _Draw()
    ;Sleep(10)
    WEnd

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

    Func _SetRotate()
    Switch @GUI_CtrlId
    Case $cSliderX
    $fRX = (50 - GUICtrlRead($cSliderX)) / 10
    Case $cSliderY
    $fRY = (50 - GUICtrlRead($cSliderY)) / 10
    Case $cSliderZ
    $fRZ = (50 - GUICtrlRead($cSliderZ)) / 10
    EndSwitch
    EndFunc ;==>_SetRotate

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

    Func _Draw()

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

    Local $iW2 = $iWidth / 2
    Local $iH2 = $iHeight / 2

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

    Local Static $fA = 0, $fB = 0, $fC = 0
    $fA += $fRX
    $fB += $fRY
    $fC += $fRZ

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

    If $fA >= 360 Then
    $fA -= 360
    ElseIf $fA <= 0 Then
    $fA += 360
    EndIf

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

    If $fB >= 360 Then
    $fB -= 360
    ElseIf $fB <= 0 Then
    $fB += 360
    EndIf

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

    If $fC >= 360 Then
    $fC -= 360
    ElseIf $fC <= 0 Then
    $fC += 360
    EndIf

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

    _Rotate($aPnt[0], $aPnt[3], $aPnt[4], $aPnt[1], $aPnt[2], $fA, $fB, $fC, $iW2, $iH2)

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

    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreatePath2", "ptr", $aPnt[6], "ptr", $aPnt[7], "int", $aPnt[0], "int", 0, "int*", 0)
    Local $hPath = $aResult[5]

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

    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreatePath", "int", 0, "int*", 0)
    Local $hPath_FG = $aResult[2]
    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreatePath", "int", 0, "int*", 0)
    Local $hPath_BG = $aResult[2]

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

    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreatePathIter", "int*", 0, "hwnd", $hPath)
    Local $hPathIter = $aResult[1]
    Local $aIter = $aPnt[8]

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

    For $i = 1 To $aIter[0][0]
    DllCall($ghGDIPDll, "uint", "GdipPathIterNextSubpathPath", "hwnd", $hPathIter, "int*", 0, "hwnd", $aIter[$i][1], "int*", 0)
    If DllStructGetData($aPnt[2], 1, ($aIter[$i][2]) + 1) > 20 Then
    DllCall($ghGDIPDll, "uint", "GdipAddPathPath", "hwnd", $hPath_BG, "hwnd", $aIter[$i][1], "int", 1)
    Else
    DllCall($ghGDIPDll, "uint", "GdipAddPathPath", "hwnd", $hPath_FG, "hwnd", $aIter[$i][1], "int", 1)
    EndIf
    Next

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

    DllCall($ghGDIPDll, "uint", "GdipDeletePathIter", "hwnd", $hPathIter)

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

    For $i = 1 To 3
    _GDIPlus_GraphicsDrawImage($hGfxBuffer, $hBmpScale, 0, 0)
    _GDIPlus_GraphicsFillRect($hGfxBuffer, 0, 0, $iWidth, $iHeight, $hBrush)

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

    DllCall($ghGDIPDll, "uint", "GdipDrawPath", "hwnd", $hGfxBuffer, "hwnd", $hPenGL, "hwnd", $hPath)

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

    _GDIPlus_GraphicsDrawImage($hGfxScale, $hBmpBuffer, 0, 0)
    Next
    DllCall($ghGDIPDll, "uint", "GdipDrawPath", "hwnd", $hGfxBuffer, "hwnd", $hPenBG, "hwnd", $hPath_BG)
    DllCall($ghGDIPDll, "uint", "GdipDrawPath", "hwnd", $hGfxBuffer, "hwnd", $hPenFG, "hwnd", $hPath_FG)

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

    DllCall($ghGDIPDll, "uint", "GdipDeletePath", "hwnd", $hPath)
    DllCall($ghGDIPDll, "uint", "GdipDeletePath", "hwnd", $hPath_BG)
    DllCall($ghGDIPDll, "uint", "GdipDeletePath", "hwnd", $hPath_FG)

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

    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    EndFunc ;==>_Draw

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

    Func _Rotate($iCount, ByRef $tP_O, ByRef $tPZ_O, ByRef $tP_N, ByRef $tPZ_N, $fA, $fB, $fC, $iW2, $iH2)
    $fA *= $Deg2Rad
    $fB *= $Deg2Rad
    $fC *= $Deg2Rad

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

    Local $fX, $fY, $fZ, $fPX, $fPY, $fPZ

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

    For $i = 0 To $iCount - 1
    $fPX = DllStructGetData($tP_O, 1, $i * 2 + 1)
    $fPY = DllStructGetData($tP_O, 1, $i * 2 + 2)
    $fPZ = DllStructGetData($tPZ_O, 1, $i + 1)

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

    $fY = $fPY * Cos($fA) - $fPZ * Sin($fA)
    $fZ = $fPY * Sin($fA) + $fPZ * Cos($fA)
    $fPY = $fY
    $fPZ = $fZ

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

    $fX = $fPX * Cos($fB) + $fPZ * Sin($fB)
    $fZ = -$fPX * Sin($fB) + $fPZ * Cos($fB)
    $fPX = $fX

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

    DllStructSetData($tP_N, 1, $fPX * Cos($fC) - $fPY * Sin($fC) + $iW2, $i * 2 + 1)
    DllStructSetData($tP_N, 1, $fPY * Cos($fC) + $fPX * Sin($fC) + $iH2, $i * 2 + 2)
    DllStructSetData($tPZ_N, 1, $fZ, $i + 1)
    Next

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

    EndFunc ;==>_Rotate

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

    Func _CreateBall($sText, $fScaleX, $fScaleY, $iW, $iH, $fBallSize, $sFont = "Arial", $fFlat = 5)
    Local $aSplit = StringSplit($sText, "|")

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

    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreatePath", "int", 0, "int*", 0)
    Local $hPath = $aResult[2]

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

    Local $hFormat = _GDIPlus_StringFormatCreate()
    Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
    Local $tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)
    Local $tBounds = _GDIPlus_RectFCreate(0, 0, 0, 0)

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

    For $i = 1 To $aSplit[0]
    DllCall($ghGDIPDll, "uint", "GdipAddPathString", "hwnd", $hPath, "wstr", $aSplit[$i], "int", -1, "hwnd", $hFamily, "int", 0, "float", 50, "ptr", DllStructGetPtr($tLayout), "hwnd", $hFormat)
    DllCall($ghGDIPDll, "uint", "GdipGetPathWorldBounds", "hwnd", $hPath, "ptr", DllStructGetPtr($tBounds), "hwnd", 0, "hwnd", 0)
    DllStructSetData($tLayout, "Y", DllStructGetData($tBounds, "Y") + DllStructGetData($tBounds, "Height"))
    Next

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

    DllCall($ghGDIPDll, "uint", "GdipFlattenPath", "hwnd", $hPath, "hwnd", 0, "float", $fFlat)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)

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

    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetPointCount", "hwnd", $hPath, "int*", 0)
    Local $iCount = $aResult[2]
    Local $tPathData = DllStructCreate("int;ptr;ptr")
    Local $tPoints = DllStructCreate("float[" & $iCount * 2 & "]")
    Local $tTypes = DllStructCreate("ubyte[" & $iCount & "]")
    Local $tPointsZ = DllStructCreate("float[" & $iCount & "]")

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

    DllStructSetData($tPathData, 1, $iCount)
    DllStructSetData($tPathData, 2, DllStructGetPtr($tPoints))
    DllStructSetData($tPathData, 3, DllStructGetPtr($tTypes))

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

    DllCall($ghGDIPDll, "uint", "GdipGetPathData", "hwnd", $hPath, "ptr", DllStructGetPtr($tPathData))

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

    Local $fRad = $iH / 2 * $fBallSize
    If $iH > $iW Then $fRad = $iW / 2 * $fBallSize

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

    Local $fPIY = $PI * $fScaleY

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

    Local $fX, $fY, $fZ, $fA, $fB, $fPX, $fPY, $fPZ
    Local $fBX = (DllStructGetData($tBounds, "X") + DllStructGetData($tBounds, "Width")) / $fScaleX
    Local $fBY = (DllStructGetData($tBounds, "Y") + DllStructGetData($tBounds, "Height")) / $fScaleY

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

    For $i = 0 To $iCount - 1
    $fX = DllStructGetData($tPoints, 1, $i * 2 + 1)
    $fY = DllStructGetData($tPoints, 1, $i * 2 + 2)

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

    $fB = $PI - $fX * $PI2 / $fBX
    $fA = $fPIY - $fY * $PI2 / $fBY
    $fPX = 0
    $fPY = 0
    $fPZ = $fRad

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

    $fY = $fPY * Cos($fA) - $fPZ * Sin($fA)
    $fZ = $fPY * Sin($fA) + $fPZ * Cos($fA)
    $fPY = $fY
    $fPZ = $fZ

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

    $fX = $fPX * Cos($fB) + $fPZ * Sin($fB)
    $fZ = -$fPX * Sin($fB) + $fPZ * Cos($fB)

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

    DllStructSetData($tPoints, 1, $fX, $i * 2 + 1)
    DllStructSetData($tPoints, 1, $fY, $i * 2 + 2)
    DllStructSetData($tPointsZ, 1, $fZ, $i + 1)
    Next

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

    Local $tPointsRotate = DllStructCreate("float[" & $iCount * 2 & "]")
    Local $tPointsZRotate = DllStructCreate("float[" & $iCount & "]")

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

    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreatePathIter", "int*", 0, "hwnd", $hPath)
    Local $hPathIter = $aResult[1]
    $aResult = DllCall($ghGDIPDll, "uint", "GdipPathIterGetSubpathCount", "hwnd", $hPathIter, "int*", 0)
    Local $iSubCount = $aResult[2]
    Local $aIter[$iCount + 1][3] = [[$iSubCount]]
    For $i = 1 To $iSubCount
    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreatePath", "int", 0, "int*", 0)
    $aIter[$i][1] = $aResult[2]
    $aResult = DllCall($ghGDIPDll, "uint", "GdipPathIterNextSubpath", "hwnd", $hPathIter, "int*", 0, "int*", 0, "int*", 0, "int*", 0)
    $aIter[$i][2] = $aResult[3]
    Next
    DllCall($ghGDIPDll, "uint", "GdipDeletePathIter", "hwnd", $hPathIter)

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

    DllCall($ghGDIPDll, "uint", "GdipDeletePath", "hwnd", $hPath)

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

    Local $aReturn[9]
    $aReturn[0] = $iCount
    $aReturn[1] = $tPointsRotate
    $aReturn[2] = $tPointsZRotate
    $aReturn[3] = $tPoints
    $aReturn[4] = $tPointsZ
    $aReturn[5] = $tTypes
    $aReturn[6] = DllStructGetPtr($tPointsRotate)
    $aReturn[7] = DllStructGetPtr($tTypes)
    $aReturn[8] = $aIter

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

    Return $aReturn
    EndFunc ;==>_CreateBall

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

    Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func WM_ERASEBKGND($hWnd, $uMsgm, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_ERASEBKGND

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

    Func _Exit()
    Local $aIter = $aPnt[8]
    For $i = 1 To $aIter[0][0]
    DllCall($ghGDIPDll, "uint", "GdipDeletePath", "hwnd", $aIter[$i][1])
    Next
    _GDIPlus_PenDispose($hPenBG)
    _GDIPlus_PenDispose($hPenFG)
    _GDIPlus_PenDispose($hPenGL)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGfxScale)
    _GDIPlus_BitmapDispose($hBmpScale)
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    E

  • Script mit mehreren Mäusen bedienen

    • eukalyptus
    • 20. Juli 2011 um 13:02

    Ich glaub, ich hab mir da eben die Lösung selber geschrieben!

    Ich speichere einfach die Events im Hook in globale Variablen und führe sie erst beim nächsten mal aus.

    [autoit]

    Func _MouseHook_Proc_LL($nCode, $wParam, $lParam)
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hMouse_Hook_LL, $nCode, $wParam, $lParam)

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

    Local $iMouse_Event = BitAND($wParam, 0xFFFF)
    ;If $iMouse_Event = 512 Then Return 1
    If $Block Then Return 1

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

    Local $Return=_WinAPI_CallNextHookEx($hMouse_Hook_LL, $_nCode, $_wParam, $_lParam)
    $_nCode = $nCode
    $_wParam = $wParam
    $_lParam = $lParam

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

    Return $Return
    EndFunc ;==>_MouseHook_Proc_LL

    [/autoit]

    Das scheint mal ganz gut zu klappen, obwohl die Events eigentlich um 1 hinterherhinken ^^
    Werd das mal austesten...

    Edit: falscher Alarm :( das kann ja nicht klappen :wacko:

    Edit 2: könnte man die Events mit JournalRecord und JournalPlayback Hooks aufzeichnen, filtern und dann abspielen?

  • Script mit mehreren Mäusen bedienen

    • eukalyptus
    • 20. Juli 2011 um 12:48

    Maus A soll nur für mein Programm funktionieren und Maus B ganz normal, also auch für andere Anwendungen.
    Es ist einfacher nur eine Maus zu blockieren, als alle Mäuse und nur die gewünschten Events zu simulieren.
    (Synthetisierte Events klappen auch nicht immer so, wie die originalen Events?!)

    Kann ich die Events im Hook zwischenspeichern und später (nach RawInput) erst weiterleiten?

    Am besten wäre, wenn ich Windows mitteilen könnte, daß z.B. Maus A nicht als Maus behandelt werden soll.
    Dazu müsste ich aber einen Filtertreiber schreiben, der für USB und PS/2 funktioniert und das kann/will ich nicht!

    Ich glaube mal gelesen zu haben, daß mein Vorhaben mit DirectInput gehen könnte - weiß jemand mehr?

    thx

  • Script mit mehreren Mäusen bedienen

    • eukalyptus
    • 20. Juli 2011 um 12:07

    Es geht darum zu erfahren, welche der 2 Mäuse die Aktion ausführt.
    Und das kann ich im Hook nicht auslesen, oder doch?

  • Script mit mehreren Mäusen bedienen

    • eukalyptus
    • 20. Juli 2011 um 11:36

    Hi

    Ich versuch das mal zu erklären:
    Für ein Programm benötige ich 2 Mäuse für die Bedienung
    Eine Maus steuert einen Cursor, welcher nur in einem Fenster agiert, und die zweite Maus benötigt man um gleichzeitig Einstellungen vorzunehmen.
    (Der erste Cursor könnte auch von einem Joystick gesteuert werden, den aber nicht jeder Benutzer besitzt - jedoch die meisten haben einen Laptop mit Touchpad und eine USB-Maus)
    Darüberhinaus soll das Programm im Extremfall aber auch mit nur einer Maus gesteuert werden können, dazu muß man die rechte Maustaste gedrückt halten, während man Einstellungen vornimmt, damit sich der erste Cursor nicht bewegt...

    Mehrere Mäuse können via RawInput gelesen werden, jedoch bewegen alle Mäuse den Mauszeiger bzw. alle Tastenklicks verursachen auch Mausklicks.
    Dies soll jedoch bei der "ersten" Maus nicht passieren.

    Meine Idee war ursprünglich folgende:
    Ich registriere einen Mausinput via RawInput und eintscheide dann, ob diese Aktion von Windows auch ausgeführt werden darf - wenn nicht, dann blockiere ich die Maus in einem $WM_MOUSE_LL-Hook

    Da gibt es jedoch ein großes Problem: $WM_MOUSE_LL-Hook wird VOR RawInput aufgerufen und ich hab keine Chance auf diesem Weg! ?(

    Nun mache ich es so: Ich blockiere grundsätzlich alle Mauseingaben und gebe nur die frei, die nicht von der "ersten" Maus stammen - Alles klar? :D
    Mausklicks leite ich jedoch nicht weiter, sondern muß sie via MouaseClick synthetisieren

    Die Lösung ist nicht ganz zufriedenstellend, aber für meine Zwecke reicht es fürs erste...
    Es wär jedenfalls viel einfacher und besser, wenn RawInput vor dem Hook passieren würde X(

    Naja, hier das TestScript:
    Die Radiobuttons auf der linken Seite sind für die Maus, die den normalen Mauszeiger bewegen soll.
    Die auf der rechten Seite sind für den GDI+-Cursor im Hauptfenster
    getestet bisher nur auf WinXP, allerdings bereits mit 4 Mäusen ^^

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    _GDIPlus_Startup()

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

    Global $hGui_Map = GUICreate("MultiMouse Test Map", 600, 400, @DesktopWidth / 2 - 405, @DesktopHeight / 2 - 200, -1, $WS_EX_TOPMOST)
    GUISetOnEvent(-3, "_Exit")

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

    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui_Map)
    Global $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics(600, 400, $hGraphics)
    Global $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)

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

    Global $hPen = _GDIPlus_PenCreate(0xFF00FF00, 3)

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

    Global $hGui_Set = GUICreate("MultiMouse Test Set", 200, 400, @DesktopWidth / 2 + 205, @DesktopHeight / 2 - 200, -1, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW), $hGui_Map)
    GUISetOnEvent(-3, "_Exit")
    Global $cButton1 = GUICtrlCreateButton("Test 1", 10, 10, 180, 25)
    GUICtrlSetOnEvent(-1, "_Test1")
    Global $cButton2 = GUICtrlCreateButton("Test 2", 10, 50, 180, 25)
    GUICtrlSetOnEvent(-1, "_Test2")

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

    Global $aRadio_Normal[6]
    Global $aLabel[6]
    GUIStartGroup()
    For $i = 1 To 5
    $aLabel[$i] = GUICtrlCreateLabel("Maus " & $i, 80, 100 + ($i - 1) * 20, 120, 20, 0x0C)
    $aRadio_Normal[$i] = GUICtrlCreateRadio("", 10, 100 + ($i - 1) * 20, 20, 20)
    GUICtrlSetOnEvent(-1, "_ActivateMouse_Normal")
    Next
    Global $aRadio_Cursor[6]
    Global $aActive[6]
    GUIStartGroup()
    For $i = 1 To 5
    $aRadio_Cursor[$i] = GUICtrlCreateRadio("", 30, 100 + ($i - 1) * 20, 20, 20)
    GUICtrlSetOnEvent(-1, "_ActivateMouse_Cursor")
    $aActive[$i] = GUICtrlCreateLabel("", 50, 100 + ($i - 1) * 20, 20, 20)
    Next

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUIRegisterMsg($WM_ERASEBKGND, "WM_ERASEBKGND")
    GUIRegisterMsg(0x00FF, "WM_INPUT")
    GUISetState(@SW_SHOW, $hGui_Map)
    GUISetState(@SW_SHOW, $hGui_Set)

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

    Global $aMice = _MM_GetMiceList()
    ;_ArrayDisplay($aMice)
    $aRadio_Normal[0] = 1
    $aRadio_Cursor[0] = 2
    GUICtrlSetState($aRadio_Normal[1], $GUI_CHECKED)
    GUICtrlSetState($aRadio_Cursor[2], $GUI_CHECKED)

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

    If $aMice[0][0] < 2 Then
    $aRadio_Cursor[0] = 1
    GUICtrlSetState($aRadio_Cursor[1], $GUI_CHECKED)
    EndIf

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

    For $i = 1 To 5
    If $i <= $aMice[0][0] Then
    GUICtrlSetData($aLabel[$i], $aMice[$i][1])
    Else
    GUICtrlSetState($aRadio_Normal[$i], $GUI_DISABLE)
    GUICtrlSetState($aRadio_Cursor[$i], $GUI_DISABLE)
    EndIf
    Next

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

    Global $aCursor[6] = [0, 0, 25, MouseGetPos(0), MouseGetPos(1), 0]
    _DrawCursor()

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

    Global $aMouseStructs = _MM_CreateMouseStructs()
    _MM_RegisterMice($hGui_Map)

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

    Global $Block = True

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

    Global $hHook_Module_LL = _WinAPI_GetModuleHandle(0)
    Global $hMouse_Proc_LL = DllCallbackRegister("_MouseHook_Proc_LL", "int", "int;ptr;ptr")
    Global $hMouse_Hook_LL = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hMouse_Proc_LL), $hHook_Module_LL, 0)
    OnAutoItExitRegister("_OnExit")

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

    While 1

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

    Sleep(100)
    WEnd

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

    Func _MouseHook_Proc_LL($nCode, $wParam, $lParam)
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hMouse_Hook_LL, $nCode, $wParam, $lParam)

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

    Local $iMouse_Event = BitAND($wParam, 0xFFFF)
    If $iMouse_Event = 512 Then Return 1
    If $Block Then Return 1

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

    Return _WinAPI_CallNextHookEx($hMouse_Hook_LL, $nCode, $wParam, $lParam)
    EndFunc ;==>_MouseHook_Proc_LL

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

    Func _ActivateMouse_Normal()
    For $i = 1 To 5
    If @GUI_CtrlId = $aRadio_Normal[$i] Then $aRadio_Normal[0] = $i
    Next
    $aCursor[5] = 0
    EndFunc ;==>_ActivateMouse_Normal

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

    Func _ActivateMouse_Cursor()
    For $i = 1 To 5
    If @GUI_CtrlId = $aRadio_Cursor[$i] Then $aRadio_Cursor[0] = $i
    Next
    $aCursor[5] = 0
    EndFunc ;==>_ActivateMouse_Cursor

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

    Func _MM_CreateMouseStructs()
    Local $tMouse = DllStructCreate("dword dwType; dword dwSize; hwnd hDevice; uint_ptr wParam; ushort usFlags; ushort usButtonFlags; ushort usButtonData; ulong ulRawButtons; long lLastX; long lLastY; ulong ulExtraInformation;")
    Local $pMouse = DllStructGetPtr($tMouse)
    Local $iMouse = DllStructGetSize($tMouse)
    Local $tHeader = DllStructCreate("dword dwType; dword dwSize; hwnd hDevice; uint_ptr wParam;")
    Local $iHeader = DllStructGetSize($tHeader)
    Local $aReturn[4]
    $aReturn[0] = $tMouse
    $aReturn[1] = $pMouse
    $aReturn[2] = $iMouse
    $aReturn[3] = $iHeader
    Return $aReturn
    EndFunc ;==>_MM_CreateMouseStructs

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

    Func WM_INPUT($hWnd, $Msg, $wParam, $lParam)
    Local $aResult = DllCall("user32.dll", "dword", "GetRawInputData", "hwnd", $lParam, "dword", 0x10000003, "ptr", $aMouseStructs[1], "dword*", $aMouseStructs[2], "uint", $aMouseStructs[3])
    If Not @error Then
    Local $hDevice = DllStructGetData($aMouseStructs[0], "hDevice")
    If Not $hDevice Then Return 'GUI_RUNDEFMSG'

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

    Local $iX = DllStructGetData($aMouseStructs[0], "lLastX")
    Local $iY = DllStructGetData($aMouseStructs[0], "lLastY")
    Local $iButton = DllStructGetData($aMouseStructs[0], "usButtonData")

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

    For $i = 1 To $aMice[0][0]
    If $aMice[$i][0] = $hDevice Then
    GUICtrlSetBkColor($aActive[$i], 0x00FF00)
    Switch $i
    Case $aRadio_Cursor[0]
    If $iButton = 4 Or $iButton = 8 Then $aCursor[5] = $iButton
    If $aCursor[5] <> 4 Then
    $aCursor[0] += $iX
    $aCursor[1] += $iY
    If $aCursor[0] < 0 Then $aCursor[0] = 0
    If $aCursor[1] < 0 Then $aCursor[1] = 0
    If $aCursor[0] > 600 Then $aCursor[0] = 600
    If $aCursor[1] > 400 Then $aCursor[1] = 400

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

    If $aRadio_Cursor[0] = $aRadio_Normal[0] Then
    Local $tPoints = DllStructCreate("int;int;")
    DllStructSetData($tPoints, 1, $aCursor[0])
    DllStructSetData($tPoints, 2, $aCursor[1])
    _WinAPI_ClientToScreen($hGui_Map, $tPoints)
    $aCursor[3] = DllStructGetData($tPoints, 1)
    $aCursor[4] = DllStructGetData($tPoints, 2)
    EndIf
    _DrawCursor()
    EndIf
    If $i = $aRadio_Normal[0] Then ContinueCase

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

    Case Else
    $aCursor[3] += $iX
    $aCursor[4] += $iY
    If $aCursor[3] < 0 Then $aCursor[3] = 0
    If $aCursor[4] < 0 Then $aCursor[4] = 0
    If $aCursor[3] > @DesktopWidth Then $aCursor[3] = @DesktopWidth
    If $aCursor[4] > @DesktopHeight Then $aCursor[4] = @DesktopHeight

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

    DllCall("user32.dll", "BOOL", "SetCursorPos", "int", $aCursor[3], "int", $aCursor[4])

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

    If $iButton = 1 Then
    $Block = False
    MouseClick("left", $aCursor[3], $aCursor[4], 1, 0)
    EndIf

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

    EndSwitch
    Else
    GUICtrlSetBkColor($aActive[$i], 0xFF0000)
    EndIf
    Next
    EndIf
    $Block = True
    Return 'GUI_RUNDEFMSG'
    EndFunc ;==>WM_INPUT

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

    Func _MM_GetMiceList()
    Local $aMice[1][3] = [[0]]
    Local $tStruct = DllStructCreate("hwnd hDevice; dword dwType;")
    Local $aResult = DllCall("user32.dll", "dword", "GetRawInputDeviceList", "ptr", 0, "dword*", 0, "dword", DllStructGetSize($tStruct))
    If @error Then Return SetError(1, 1, $aMice)
    If Not $aResult[2] Then Return SetError(1, 2, $aMice)
    Local $iCnt = $aResult[2]

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

    Local $sInfo = ""
    For $i = 1 To $iCnt
    $sInfo &= StringRegExpReplace("hwnd hDevice; dword dwType; ", "(\w+);", "${1}" & $i & ";")
    Next

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

    Local $tList = DllStructCreate($sInfo)
    $aResult = DllCall("user32.dll", "dword", "GetRawInputDeviceList", "ptr", DllStructGetPtr($tList), "dword*", $iCnt, "dword", DllStructGetSize($tStruct))
    If @error Then Return SetError(1, 3, $aMice)

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

    Local $aInfo = _MM_Get_MiceInfo()

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

    Local $iStep = 0
    Local $tName

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

    Local $hDevice, $iSize, $sName_dbcc, $sName, $aRegExp
    For $i = 1 To $iCnt
    If DllStructGetData($tList, 'dwType' & $i) = 0 Then
    $hDevice = DllStructGetData($tList, "hDevice" & $i)

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

    $aResult = DllCall("user32.dll", "dword", "GetRawInputDeviceInfo", "hwnd", $hDevice, "dword", 0x20000007, "ptr", 0, "dword*", 0)
    If @error Or Not IsArray($aResult) Then ContinueLoop
    $iSize = $aResult[4]
    $tName = DllStructCreate("char[" & $iSize & "];")

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

    $aResult = DllCall("user32.dll", "dword", "GetRawInputDeviceInfo", "hwnd", $hDevice, "dword", 0x20000007, "ptr", DllStructGetPtr($tName), "dword*", $iSize)
    If @error Or Not IsArray($aResult) Then ContinueLoop

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

    $sName_dbcc = DllStructGetData($tName, 1)
    $aRegExp = StringRegExp($sName_dbcc, "[\w\d&]+", 3)
    $sName = ""
    If UBound($aRegExp) > 2 And IsArray($aInfo) Then
    For $j = 1 To $aInfo[0][0]
    If StringInStr($aInfo[$j][2], $aRegExp[1]) Then
    $sName = $aInfo[$j][10]
    ExitLoop
    EndIf
    Next
    EndIf

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

    If Not $sName Or StringInStr($sName_dbcc, "RDP_MOU") Then ContinueLoop

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

    $iStep += 1
    ReDim $aMice[$iStep + 1][3]
    $aMice[$iStep][0] = $hDevice
    $aMice[$iStep][1] = $sName
    $aMice[$iStep][2] = $sName_dbcc

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

    EndIf
    Next
    $aMice[0][0] = $iStep
    Return $aMice
    EndFunc ;==>_MM_GetMiceList

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

    Func _MM_Get_MiceInfo()
    Local $aMice[1][18] = [[0, 'Description', 'Device ID', 'Device Interface', 'Double Speed Threshold', 'Handedness', 'Hardware Type', 'INF File Name', 'INF Section', 'Manufacturer', 'Name', 'Number Of Buttons', 'PNP Device ID', 'Pointing Type', 'Quad Speed Threshold', 'Resolution', 'Sample Rate', 'Synch']]
    Local $iCnt = 0
    Local $oWMI = ObjGet('winmgmts:\\' & @ComputerName & '\root\cimv2')
    If Not @error And IsObj($oWMI) Then
    Local $cItems = $oWMI.ExecQuery('Select * from Win32_PointingDevice')
    Local $oItem, $Temp
    For $oItem In $cItems
    $iCnt += 1
    ReDim $aMice[$iCnt + 1][18]
    $aMice[$iCnt][1] = $oItem.Description
    $aMice[$iCnt][2] = $oItem.DeviceID
    $Temp = $oItem.DeviceInterface
    Switch $Temp
    Case 1
    $aMice[$iCnt][3] = "Other"
    Case 2
    $aMice[$iCnt][3] = "Unknown"
    Case 3
    $aMice[$iCnt][3] = "Serial"
    Case 4
    $aMice[$iCnt][3] = "PS/2"
    Case 5
    $aMice[$iCnt][3] = "Infrared"
    Case 6
    $aMice[$iCnt][3] = "HP-HIL"
    Case 7
    $aMice[$iCnt][3] = "Bus mouse"
    Case 8
    $aMice[$iCnt][3] = "ADB (Apple Desktop Bus)"
    Case 160
    $aMice[$iCnt][3] = "Bus mouse DB-9"
    Case 161
    $aMice[$iCnt][3] = "Bus mouse micro-DIN"
    Case 162
    $aMice[$iCnt][3] = "USB"
    EndSwitch

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

    $aMice[$iCnt][4] = $oItem.DoubleSpeedThreshold
    $aMice[$iCnt][5] = $oItem.Handedness
    $aMice[$iCnt][6] = $oItem.HardwareType
    $aMice[$iCnt][7] = $oItem.InfFileName
    $aMice[$iCnt][8] = $oItem.InfSection
    $aMice[$iCnt][9] = $oItem.Manufacturer
    $aMice[$iCnt][10] = $oItem.Name
    $aMice[$iCnt][11] = $oItem.NumberOfButtons
    $aMice[$iCnt][12] = $oItem.PNPDeviceID
    $aMice[$iCnt][13] = $oItem.PointingType
    $aMice[$iCnt][14] = $oItem.QuadSpeedThreshold
    $aMice[$iCnt][15] = $oItem.Resolution
    $aMice[$iCnt][16] = $oItem.SampleRate
    $aMice[$iCnt][17] = $oItem.Synch
    Next
    $aMice[0][0] = $iCnt
    Return $aMice
    EndIf

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

    Return SetError(1, 1, $aMice)
    EndFunc ;==>_MM_Get_MiceInfo

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

    Func _MM_RegisterMice($hGui)
    Local Const $RIDEV_INPUTSINK = 0x00000100

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

    Local $tStruct = DllStructCreate("ushort usUsagePage; ushort usUsage; dword dwFlags; hwnd hwndTarget;")
    DllStructSetData($tStruct, "usUsagePage", 0x01)
    DllStructSetData($tStruct, "usUsage", 0x02)
    DllStructSetData($tStruct, "dwFlags", $RIDEV_INPUTSINK)
    DllStructSetData($tStruct, "hwndTarget", $hGui)
    Local $aResult = DllCall("user32.dll", "int", "RegisterRawInputDevices", "ptr", DllStructGetPtr($tStruct), "dword", 1, "dword", DllStructGetSize($tStruct))
    If @error Then Return SetError(1, 2, False)
    Return $aResult[0]
    EndFunc ;==>_MM_RegisterMice

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

    Func _DrawCursor()
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)

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

    _GDIPlus_GraphicsDrawLine($hGfxBuffer, $aCursor[0] - $aCursor[2], $aCursor[1], $aCursor[0] + $aCursor[2], $aCursor[1], $hPen)
    _GDIPlus_GraphicsDrawLine($hGfxBuffer, $aCursor[0], $aCursor[1] - $aCursor[2], $aCursor[0], $aCursor[1] + $aCursor[2], $hPen)

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

    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    EndFunc ;==>_DrawCursor

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

    Func _Test1()
    ConsoleWrite("! Test1" & @CRLF)
    EndFunc ;==>_Test1

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

    Func _Test2()
    ConsoleWrite("> Test2" & @CRLF)
    EndFunc ;==>_Test2

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

    Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
    If $hWnd = $hGui_Map Then _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func WM_ERASEBKGND($hWnd, $uMsgm, $wParam, $lParam)
    If $hWnd = $hGui_Map Then _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_ERASEBKGND

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

    Func _Exit()
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

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

    Func _OnExit()
    _WinAPI_UnhookWindowsHookEx($hMouse_Hook_LL)
    DllCallbackFree($hMouse_Proc_LL)
    EndFunc ;==>_OnExit

    [/autoit]

    Hat jemand eine Idee, wie man das anders/besser machen könnte?

    E

  • au15k - Skriptwettbewerb - Fertig -

    • eukalyptus
    • 19. Juli 2011 um 23:15

    Klasse!
    Genau so einen Wettbewerb wollte ich vor kurzem auch starten... ^^

    Allerdings würde ich kein fixes Abgabedatum festlegen, sondern jeder kann jederzeit sein Script posten und dann wird es im ersten Post mit Vorschaubild und Sourcecode hinzugefügt (sofern es den Regeln entspricht)
    Entweder du, oder eine Jury, oder die User entscheiden das Ranking
    (geht sowas hier, also ein Ranking, das den Durchschnitt der Punkte berechnet, egal wieviele Stimmen ein Script hat; sonst wären neuere Scripte natürlich benachteiligt)

    Dann könnte hier in absehbarer Zeit eine Sammlung von beeindruckenden Scripten entstehen!

    Nochwas zu den Regeln: Meiner Meinung nach muß ein Script einfach auf einem "frisch" aufgesetzten Windows und AutoIt lauffähig sein.
    d.h. alle DLL´s, die standardmässig dabei sind, können benutzt werden.
    Wer also Dll Funktionen benötigt, die noch nicht in den standard Includes enthalten sind, der muß diese in den Code mitaufnehmen und sie zählen natürlich zu der Größe dazu :D

    E

  • Select vs. Switch

    • eukalyptus
    • 15. Juli 2011 um 13:27

    Mal abgesehen von dem Fehler: Switch kann genauso langsam sein wie Select, wenn die gleiche Art/Anzahl von Vergleichen durchgeführt werden:

    [autoit]

    Switch True
    case $var = 500
    $man = "500 - 1"
    case $var = 2000
    $man = "2000 - 2"
    case $var = 6000
    $man = "6000 - 3"
    case $var = 9999
    $man = "ENDE"
    EndSwitch

    [/autoit]
  • Unterschiedliche Mauszeiger an verschiedene Koordinaten?

    • eukalyptus
    • 8. Juli 2011 um 14:34

    Ich brauche auch 2 Mäuse für ein Script ^^

    Wenn man mehrere Mäuse (z.B.: Touchpad und USB-Maus) angeschlossen hat, dann kann man diese getrennt auslesen.
    Die Mauszeiger muss man allerdings selber zeichnen, und den richtigen Mauscursor immer auf die "aktuelle" Position setzen

    Soweit bin ich momentan:

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>

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

    Opt("MouseCoordMode", 2)
    Opt("GUIOnEventMode", 1)

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

    Global $iWidth = @DesktopWidth / 2
    Global $iHeight = @DesktopHeight / 2

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

    Global $hGui = GUICreate("MultiMouse Test", $iWidth, $iHeight)
    GUISetOnEvent(-3, "_Exit")
    GUIRegisterMsg(0x00FF, "WM_INPUT")
    GUISetState(@SW_SHOW, $hGui)

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

    Global $tMouse = DllStructCreate("dword dwType; dword dwSize; hwnd hDevice; uint_ptr wParam; ushort usFlags; ushort usButtonFlags; ushort usButtonData; ulong ulRawButtons; long lLastX; long lLastY; ulong ulExtraInformation;")
    Global $pMouse = DllStructGetPtr($tMouse)
    Global $iMouse = DllStructGetSize($tMouse)
    Global $tHeader = DllStructCreate("dword dwType; dword dwSize; hwnd hDevice; uint_ptr wParam;")
    Global $iHeader = DllStructGetSize($tHeader)

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

    Global $aMice = _GetMice()
    _RegisterMice()
    Global $aPos[$aMice[0] + 1][5]
    For $i = 2 To $aMice[0]
    $aPos[$i][0] = MouseGetPos(0)
    $aPos[$i][1] = MouseGetPos(1)
    Next

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

    OnAutoItExitRegister("_OnExit")
    ;_WinAPI_ShowCursor(False)

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

    While 1
    Sleep(100)
    WEnd

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

    Func _DrawMice()
    Local $hDC = _WinAPI_GetDC($hGui)

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

    Local $hBrush = _WinAPI_CreateSolidBrush(0x000000)
    Local $tRect = _WinAPI_GetClientRect($hGui)
    _WinAPI_FillRect($hDC, DllStructGetPtr($tRect), $hBrush)
    _WinAPI_DeleteObject($hBrush)
    For $i = 2 To $aMice[0]
    _WinAPI_DrawIcon($hDC, $aPos[$i][0] - $aPos[$i][3], $aPos[$i][1] - $aPos[$i][4], $aPos[$i][2])
    Next

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

    _WinAPI_ReleaseDC($hGui, $hDC)
    EndFunc ;==>_DrawMice

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

    Func WM_INPUT($hWnd, $Msg, $wParam, $lParam)
    Local $aResult = DllCall("user32.dll", "dword", "GetRawInputData", "hwnd", $lParam, "dword", 0x10000003, "ptr", $pMouse, "dword*", $iMouse, "uint", $iHeader)
    If Not @error Then
    Local $hDevice = DllStructGetData($tMouse, "hDevice")
    Local $iX = DllStructGetData($tMouse, "lLastX")
    Local $iY = DllStructGetData($tMouse, "lLastY")
    Local $tCursor = DllStructCreate("DWORD cbSize; DWORD flags; hwnd hCursor; Long X; Long Y;")
    DllStructSetData($tCursor, 1, DllStructGetSize($tCursor))
    Local $aInfo
    For $i = 2 To $aMice[0]
    If $aMice[$i] = $hDevice Then
    $aPos[$i][0] += $iX
    $aPos[$i][1] += $iY
    MouseMove($aPos[$i][0], $aPos[$i][1], 0)
    $aInfo = _WinAPI_GetCursorInfo()
    $aPos[$i][2] = $aInfo[2]
    $aInfo = _WinAPI_GetIconInfo($aPos[$i][2])
    $aPos[$i][3] = $aInfo[2]
    $aPos[$i][4] = $aInfo[3]
    _DrawMice()
    ExitLoop
    EndIf
    Next
    EndIf
    Return 'GUI_RUNDEFMSG'
    EndFunc ;==>WM_INPUT

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

    Func _RegisterMice()
    Local $tStruct = DllStructCreate("ushort usUsagePage; ushort usUsage; dword dwFlags; hwnd hwndTarget;")
    DllStructSetData($tStruct, "usUsagePage", 0x01)
    DllStructSetData($tStruct, "usUsage", 0x02)
    DllStructSetData($tStruct, "dwFlags", 0)
    DllStructSetData($tStruct, "hwndTarget", $hGui)
    Local $aResult = DllCall("user32.dll", "int", "RegisterRawInputDevices", "ptr", DllStructGetPtr($tStruct), "dword", 1, "dword", DllStructGetSize($tStruct))
    If @error Then Return SetError(1, 2, False)
    Return $aResult[0]
    EndFunc ;==>_RegisterMice

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

    Func _GetMice()
    Local $aMice[1] = [0]
    Local $tStruct = DllStructCreate("hwnd hDevice; dword dwType;")
    Local $aResult = DllCall("user32.dll", "dword", "GetRawInputDeviceList", "ptr", 0, "dword*", 0, "dword", DllStructGetSize($tStruct))
    If @error Then Return SetError(1, 1, $aMice)
    If Not $aResult[2] Then Return SetError(1, 2, $aMice)
    Local $iCnt = $aResult[2]

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

    Local $sInfo = ""
    For $i = 1 To $iCnt
    $sInfo &= StringRegExpReplace("hwnd hDevice; dword dwType; ", "(\w+);", "${1}" & $i & ";")
    Next

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

    Local $tInfo = DllStructCreate($sInfo)
    $aResult = DllCall("user32.dll", "dword", "GetRawInputDeviceList", "ptr", DllStructGetPtr($tInfo), "dword*", $iCnt, "dword", DllStructGetSize($tStruct))
    If @error Then Return SetError(1, 3, $aMice)

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

    Local $iStep = 0
    For $i = 1 To $iCnt
    If DllStructGetData($tInfo, 'dwType' & $i) = 0 Then
    $iStep += 1
    ReDim $aMice[$iStep + 1]
    $aMice[$iStep] = DllStructGetData($tInfo, 'hDevice' & $i)
    EndIf
    Next
    $aMice[0] = $iStep
    Return $aMice
    EndFunc ;==>_GetMice

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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

    Func _OnExit()
    _WinAPI_ShowCursor(True)
    EndFunc ;==>_OnExit

    [/autoit]

    Es funktioniert allerdings nur innerhalb des eigenen Fensters.
    Aber für meine Zwecke reicht das vollkommen, darüberhinaus benötige ich auch nur einen Mauszeiger...

    Evtl. wäre es möglich ein transparentes Fenster OnTop zu verwenden, mit UpdateLayeredWindow die Mauszeiger zu zeichnen und so mehrere Mäuse auch für fremde Anwendugen zu benutzen...
    Dazu müsste man jedoch gewährleisten, daß man auch die WM_INPUT messages bekommt, wenn ein anderes Fenster aktiv ist! - Und das ist mir momentan etwas zu kompliziert :D

    E

    Ach ja: Danke für die Starthilfe an den Autor von RawInput.au3 aus dem englischen Forum (Authenticity?!)

  • Systembedingte Text-Vergrößerung verhindern

    • eukalyptus
    • 7. Juli 2011 um 11:33

    Wenn du erreichen willst, daß ein Text immer die selbe Größe hat, bzw. immer ein gleich großes Rechteck darstellt, dann könntest du es so machen:

    Achtung: benötigt GDIp.au3!

    Spoiler anzeigen
    [autoit]

    #include <GDIP.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    _GDIPlus_Startup()

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

    $iW = 600
    $iH = 600

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

    $hGui = GUICreate("Test", $iW, $iH)
    GUISetOnEvent(-3, "_Exit")

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

    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGraphics)
    $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)

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

    $hBrush = _GDIPlus_BrushCreateSolid(0xFF00AA00)
    $hPenG = _GDIPlus_PenCreate(0xFF00FF00, 2)
    $hPenR = _GDIPlus_PenCreate(0xFFFF0000, 1)

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUISetState()

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

    $hPath = _CreateStringPath($hGfxBuffer, "Test String", 100, 100, 300, 50, "Arial")
    _GDIPlus_GraphicsDrawRect($hGfxBuffer, 100, 100, 300, 50, $hPenR)
    _GDIPlus_GraphicsFillPath($hGfxBuffer, $hPath, $hBrush)
    _GDIPlus_GraphicsDrawPath($hGfxBuffer, $hPath, $hPenG)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)

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

    While 1
    Sleep(100)
    WEnd

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

    Func _CreateStringPath($hGraphics, $sString, $fX, $fY, $fW, $fH, $sFont = "Arial")
    Local $hPath = _GDIPlus_PathCreate()

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

    Local $hFormat = _GDIPlus_StringFormatCreate()
    Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
    Local $tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)

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

    _GDIPlus_PathAddString($hPath, $sString, $tLayout, $hFamily, 0, 100, $hFormat)

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

    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)

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

    Local $aBounds = _GDIPlus_PathGetWorldBounds($hPath)
    Local $fMX = $fW / $aBounds[2]
    Local $fMY = $fH / $aBounds[3]

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

    Local $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixTranslate($hMatrix, $fX - $aBounds[0] * $fMX, $fY - $aBounds[1] * $fMY)
    _GDIPlus_MatrixScale($hMatrix, $fMX, $fMY)
    _GDIPlus_PathTransform($hPath, $hMatrix)
    _GDIPlus_MatrixDispose($hMatrix)

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

    Return $hPath
    EndFunc ;==>_CreateStringPath

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

    Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func _Exit()
    _GDIPlus_PathDispose($hPath)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_PenDispose($hPenR)
    _GDIPlus_PenDispose($hPenG)
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    E

  • Geschwindigkeitsvergleich C, Basic, Pascal Unerwartetes Ergebnis?!

    • eukalyptus
    • 7. Juli 2011 um 10:58

    Könntest du bitte die Sourcecodes dazu posten? würd mich interessieren...

    Ich hab noch einen kleinen Vergleich gemacht.
    Diesmal wird wirklich gerechnet :D
    Und zwar soll eine zackige Linie geglättet werden

    Die Variable $iStep ist die Anzahl der Durchläufe und $iPoints die Anzahl der Punkte auf dem Path (sollte nicht viel größer eingestellt werden, da sich sonst GDI+ überanstrengt ;))

    Beim ersten Test, also AutoIt, dauert es etwas länger, denn das AutoIt-Array muss auch noch in ein DllStruct umgewandelt werden, damit GDI+ es zeichnen kann.
    gemessen wird aber nur die tatsächliche Zeit der Smooth Funktion

    Die Ergebnisse:

    Code
    !==============================================
    > AutoIt: 7299.84146029733
    > FreeBasic: 7.10509296572609
    > Lazarus: 8.35301693371644
    > FreePascal: 9.44924564434865
    > DevC: 8.16165183005103
    > MinGW: 7.96330259851462
    !==============================================

    Auch hab ich mit der von Andy vorgeschlagenen ASM Sin und Cos Variante experimentiert, jedoch wurde meine Freebasic-Dll dadurch etwas langsamer
    verwendet hab ich das hier:

    Code
    Sub FBSinCos(Angle As Double, ByRef FbSin As Double, ByRef FbCos As Double)
    '©2008 by ytwinky, optimized by volta ;-))
      Asm
        fld qword Ptr [Angle] 'Angle -> st(0)
        fsincos               'compute sin AND cos
        mov edx, [FbCos]      'Addr. of fbCos -> EDX
        fstp qword Ptr [edx]  'St(0) = cos -> fbCos
        mov edx, [FbSin]      'Addr. of fbSin -> EDX
        fstp qword Ptr [edx]  'St(0) = sin -> fbSin
      End Asm
    End Sub
    Alles anzeigen

    E

    Dateien

    PathSmooth.zip 47,98 kB – 331 Downloads
  • Geschwindigkeitsvergleich C, Basic, Pascal Unerwartetes Ergebnis?!

    • eukalyptus
    • 5. Juli 2011 um 19:05
    Zitat von progandy

    Verwende am besten ASM mit SSE2-Instruktionen, wenn dir Geschwindigkeit so wichtig ist ;)

    Bei FreeBasic hab ich bereits die Compilerschalter "-fpmode Fast -fpu SSE" gefunden - das ist sozusagen nochmal der Turbo: 454ms :rock:
    Deshalb werd ich für mein Projekt FreeBasic verwenden!
    Für einen entgültigen Vergleich mit "richtigen" Algos fehlt mir aber die Zeit...

    E

  • Geschwindigkeitsvergleich C, Basic, Pascal Unerwartetes Ergebnis?!

    • eukalyptus
    • 5. Juli 2011 um 14:06

    Ich hab 10000 Durchläufe gemacht

    Ich hab nun dieses Ergebnis:

    Code
    Pascal: 651.49593034869
    Basic: 606.111111887125
    Dev_C: 1614.23197641041
    GCC: 1253.04417181513

    Mittlerweile hab ich auch einen "echten" Algo in FreeBasic und FreePascal verglichen und das Ergebnis spricht mit 410ms zu 430ms leicht für FreeBasic
    C scheidet eigentlich eh aus, da mir das etwas zu kompliziert ist :whistling:

    Desweiteren ist auch die Größe der Dll bei FreeBasic ungeschlagen:

    Code
    Pascal: 78 KB
    Basic: 8 KB
    Dev_C: 15 KB
    GCC: 25 KB

    Danke für die Antworten...

  • Geschwindigkeitsvergleich C, Basic, Pascal Unerwartetes Ergebnis?!

    • eukalyptus
    • 5. Juli 2011 um 11:57

    Danke für die Antwort!

    Ich bin schon etwas schlauer:
    FreeBasic scheint überflüssige Rechenoperationen zu optimieren.
    z.B.: wird anscheinend "Pi/180" nur einmal berechnet und der Wert dann in der Schleife verwendet, während Pascal jedesmal neu rechnet.
    Desweiteren bringt Pi als Konstante in Pascal auch einiges an Geschwindigkeit

    Ich wollte mir eigentlich ersparen, in mehreren Sprachen die Algorithmen zu schreiben, sondern schon vorher die Geschwindigkeit testen.
    Wahrscheinlich muss ich aber wirklich fertige Funktionen zum Vergleich verwenden...

    Ich sags jetzt mal so: Wenn ich zu faul bin, meine Algorithmen selber zu optimieren, dann ist FreeBasic die bessere/einfachere Lösung :D

    E

  • Geschwindigkeitsvergleich C, Basic, Pascal Unerwartetes Ergebnis?!

    • eukalyptus
    • 5. Juli 2011 um 11:19

    Danke, das hilft natürlich gewaltig, da ich sowieso nur x^2 benötige...!

    Das Ergebnis ist nun:

    Code
    + P: 723.776904606591
    > B: 632.287623147635
    - C: 1532.69368034205

    Da sieht Pascal nun etwas besser aus, aber C hinkt trotzdem noch extrem hinterher...

    Edit: Habs jetzt auch mit GNU GCC versucht und das Ergebnis ist: 2671ms 8|

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™