mehrere unabhängige cursor?

  • hallo, nach langer zeit folgende frage:
    ich würde gerne mit autoit irgendwie einen 2. cursor erzeugen, der losgelöst von der mauseingabe für autoit funktioniert. klickaktionen sollten dann mit diesem "gefakten" mauszeiger wie gewohnt ablaufen, während der eigenliche zur freien verwendung mit der maus überbleibt, um zB eine onevent gui zu bedienen... ist sowas möglich?

    • Offizieller Beitrag

    Hallo

    Ich hab dir hier mal etwas geschrieben: (ich liebe den PNG Support in AutoIt ;))

    Spoiler anzeigen
    [autoit]

    #Include <GDIPlus.au3> ; this is where the magic happens, people
    #include <GuiComboBox.au3>
    Global Const $AC_SRC_ALPHA = 1
    Global Const $ULW_ALPHA = 2
    Global $CursorGUI

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

    $cur = _CreateCursor(250, 500)

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

    For $i = 500 To 700 Step 4
    _MoveCursor($cur, $i/2, $i)
    Sleep(10)
    Next
    Sleep(1000)

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

    _DeleteCursor($cur)
    Func _CreateCursor($iLeft = -1, $iTop = -1)
    Local $width, $pngSrc, $height, $hImage, $aRet[2], $CursorGUI
    ; Load PNG file as GDI bitmap
    _GDIPlus_Startup()
    $pngSrc = @ScriptDir & "\cur.png"
    $hImage = _GDIPlus_ImageLoadFromFile($pngSrc)

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

    ; Extract image width and height from PNG
    $width = _GDIPlus_ImageGetWidth($hImage)
    $height = _GDIPlus_ImageGetHeight($hImage)

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

    ; Create layered window
    $CursorGUI = GUICreate("Cur", $width, $height, $iLeft, $iTop, $WS_POPUP, $WS_EX_LAYERED+$WS_EX_TOOLWINDOW)
    SetBitmap($CursorGUI, $hImage, 0)
    ; Register notification messages
    GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
    GUISetState()
    WinSetOnTop($CursorGUI, "", 1)
    ;fade in png background
    For $i = 0 To 255 Step 1
    SetBitmap($CursorGUI, $hImage, $i)
    Next
    $aRet[0] = $CursorGUI
    $aRet[1] = $hImage
    Return $aRet
    EndFunc ;==>_CreateCursor

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

    Func _MoveCursor($ahCur, $iLeft, $iTop)
    WinMove($ahCur[0], "", $iLeft, $iTop)
    EndFunc ;==>_MoveCursor

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

    Func _DeleteCursor($ahCursor)
    ;fade out png background
    For $i = 255 To 0 Step - 10
    SetBitmap($ahCursor[0], $ahCursor[1], $i)
    Next
    ; Release resources
    _GDIPlus_ImageDispose($ahCursor[1])
    EndFunc ;==>_DeleteCursor

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

    Func OnAutoItExit()
    _GDIPlus_Shutdown()
    EndFunc ;==>OnAutoItExit

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

    ;===============================================================================================================================
    ; Handle the WM_NCHITTEST for the layered window so it can be dragged by clicking anywhere on the image.
    ;===============================================================================================================================
    Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    If ($hWnd = $CursorGUI) And ($iMsg = $WM_NCHITTEST) Then Return $HTCAPTION
    EndFunc ;==>WM_NCHITTEST

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

    ;===============================================================================================================================
    ; SetBitMap
    ;===============================================================================================================================
    Func SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

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

    $hScrDC = _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
    EndFunc ;==>SetBitmap

    [/autoit]

    Ich hoffe das hilft dir weiter :)

    Mfg Spider

    Edit: cur.png angehangen (siehe unten)
    Edit2: Hab mal eben den lästigen eintrag in der Taskleiste entfernt ($WS_EX_TOOLWINDOW)

  • yep, das wars :) aber wie wende ich das an? bin noch etwas zu unerfahren.... erzeugt das eine art layer? das wäre noch viel besser. naja, eine dokumentation dazu wäre nicht schlecht.

  • Gta, 100% selbst gemacht?

    wenn ja: Freak ^^
    Wenn ja: Genial
    Wenn ja: <3

    Wenn nein: (weil eben die beschreibungen auf englisch sind - nicht dass ich es dir net zutrauen würde! :thumbup: )

    Credits :love:

    • Offizieller Beitrag

    Hallo

    Naja, es gibt ein Tutorial im engl Forum, was ich hier aber auch schon ziemlich oft gepostet hab.
    Lod3n hat das Tutorial geschrieben und PaulIA hat (wie hofefntlich bekannt) die Auto3Lib, die jetzt in der Version 3.2.10.0 von AutoIt intriegriert ist, erstellt.

    Die Funktionen _CreateCursor , _DeleteCursor und _MoveCursor hab ich aber alle selbst erstellt

    Ich hab im Anhang von dem Oberem Post auch nochmal eine "cur.png" angehangen, wie der Cursor ungefair aussehen könnte.

    Mfg Spider