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?
mehrere unabhängige cursor?
-
- [ offen ]
-
Lon -
14. Dezember 2007 um 21:49 -
Geschlossen -
Erledigt
-
-
- 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
[/autoit] [autoit][/autoit] [autoit]
#include <GuiComboBox.au3>
Global Const $AC_SRC_ALPHA = 1
Global Const $ULW_ALPHA = 2
Global $CursorGUI$cur = _CreateCursor(250, 500)
[/autoit] [autoit][/autoit] [autoit]For $i = 500 To 700 Step 4
[/autoit] [autoit][/autoit] [autoit]
_MoveCursor($cur, $i/2, $i)
Sleep(10)
Next
Sleep(1000)_DeleteCursor($cur)
[/autoit] [autoit][/autoit] [autoit]
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); Extract image width and height from PNG
[/autoit] [autoit][/autoit] [autoit]
$width = _GDIPlus_ImageGetWidth($hImage)
$height = _GDIPlus_ImageGetHeight($hImage); Create layered window
[/autoit] [autoit][/autoit] [autoit]
$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 ;==>_CreateCursorFunc _MoveCursor($ahCur, $iLeft, $iTop)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
WinMove($ahCur[0], "", $iLeft, $iTop)
EndFunc ;==>_MoveCursorFunc _DeleteCursor($ahCursor)
[/autoit] [autoit][/autoit] [autoit]
;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 ;==>_DeleteCursorFunc OnAutoItExit()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_GDIPlus_Shutdown()
EndFunc ;==>OnAutoItExit;===============================================================================================================================
[/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$hScrDC = _WinAPI_GetDC(0)
[/autoit]
$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 ;==>SetBitmapIch 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) -
hui, besten dank, sieht schon verdammt gut aus woher bekomme ich aber die beiden includes?
-
- Offizieller Beitrag
-
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:Wenn nein: (weil eben die beschreibungen auf englisch sind - nicht dass ich es dir net zutrauen würde! )
Credits
-
- 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