Aktuellen Cursor rausfinden...

  • Ich muss für ein Tool den Cursor temporär ändern, dazu hab ich auch schon ne UDF gefunden:

    [autoit]

    Func _SetCursor($s_file, $i_cursor)
    Local $newhcurs, $lResult
    $newhcurs = DllCall("user32.dll", "int", "LoadCursorFromFile", "str", $s_file)
    If Not @error Then
    $lResult = DllCall("user32.dll", "int", "SetSystemCursor", "int", $newhcurs[0], "int", $i_cursor)
    If Not @error Then
    $lResult = DllCall("user32.dll", "int", "DestroyCursor", "int", $newhcurs[0])
    Else
    MsgBox(0, "Error", "Failed SetSystemCursor")
    EndIf
    Else
    MsgBox(0, "Error", "Failed LoadCursorFromFile")
    EndIf
    EndFunc ;==>_SetCursor

    [/autoit]


    So weit, so gut. Jetzt will ich den OriginalCursor aber wiederherstellen...
    Geht das auch mit Au3, oder muss ich das umständlich über die Registry machen?

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

    Einmal editiert, zuletzt von L3viathan2142 (23. Dezember 2008 um 12:21)

  • Hab ich versucht, ich kriegs aber irgendwie nicht hin...:
    Ich muss doch das Handle erst mit _WinAPI_LoadImage laden, oder?
    Ist das dann so richtig, denn es klappt nicht:

    [autoit]

    #include <WinAPI.au3>
    #include <Constants.au3>
    $cur=_WinAPI_LoadImage(0,"crosshair.cur",$IMAGE_CURSOR,0,0,$LR_DEFAULTSIZE+$LR_LOADFROMFILE)
    _WinAPI_SetCursor($cur)
    sleep(2500)

    [/autoit]


    edit:
    So gehts auch nicht:

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    $old=_WinAPI_GetCursorInfo()
    Func _SetCursor($s_file, $i_cursor)
    Local $newhcurs, $lResult
    $newhcurs = DllCall("user32.dll", "int", "LoadCursorFromFile", "str", $s_file)
    If Not @error Then
    $lResult = DllCall("user32.dll", "int", "SetSystemCursor", "int", $newhcurs[0], "int", $i_cursor)
    If Not @error Then
    $lResult = DllCall("user32.dll", "int", "DestroyCursor", "int", $newhcurs[0])
    Else
    MsgBox(0, "Error", "Failed SetSystemCursor")
    EndIf
    Else
    MsgBox(0, "Error", "Failed LoadCursorFromFile")
    EndIf
    EndFunc ;==>_SetCursor
    _SetCursor("crosshair.cur",32512)
    sleep(3000)
    _WinAPI_SetCursor($old[2])

    [/autoit]

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

    Einmal editiert, zuletzt von L3viathan2142 (21. Dezember 2008 um 13:21)

    • Offizieller Beitrag

    Du mußt den Cursorpfad angeben

    [autoit]

    @WindowsDir & '\Cursors\cross.cur'

    [/autoit]


    Und Kombinationen von Parametern immer mit BitOr($par1,$par2) und nicht $par1+$par2.

    Weiterhin solltest du das Handle des alten Cursors auffangen um ihn zurücksetzen zu können.

    [autoit]

    $hOldCursor = _WinAPI_SetCursor($cur)

    [/autoit]
  • Ja, aber es will einfach nicht klappen:
    Für _WinAPI_SetCursor brauche ich doch ein Handle, oder?

    [autoit]

    #include <WinAPI.au3>
    #include <Constants.au3>
    $cur=_WinAPI_LoadImage(0,@WindowsDir & '\Cursors\cross.cur',$IMAGE_CURSOR,0,0,BitOr($LR_DEFAULTSIZE,$LR_LOADFROMFILE))
    $hOldCursor = _WinAPI_SetCursor($cur)
    sleep(3000)
    _WinAPI_SetCursor($hOldCursor)

    [/autoit]


    Funzt nicht. Keine Fehlermeldung, kein Erfolg.
    Zu dumm, dass in der Hilfe keine Examples zu den WinAPI-Befehlen sind. :wacko:

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

    • Offizieller Beitrag

    Irre ich oder hast du einen Denkfehler mit

    [autoit]

    $hOldCursor = _WinAPI_SetCursor($cur)

    [/autoit]

    weißt du der Var $hOldCursor doch den neuen Cursor zu .Und nicht den alte Cursor .

    Edit: Ich sollte vorher erst mal in der Hilfe nachlesen . Mein Fehler . Der Denkfehler liegt bei mir . :whistling:

  • Also:
    Es ist ein AutoItscript, natürlich, aber:
    Der Cursor soll überall verändert sein, nicht nur über der GUI.
    Es muss aber nicht umbedingt bei edits und inputs sein, hauptsache der Standartcursor wird für die Laufzeit gewechselt.

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

    • Offizieller Beitrag

    Hallo

    Probier das mal aus ;)

    [autoit]

    Global Const $OCR_IBEAM = 32513
    Global Const $OCR_WAIT = 32514

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

    $hWaitCurs = DllCall("user32.dll", "int", "LoadCursorA", "hwnd", 0, "int", $OCR_WAIT)
    DllCall("user32.dll", "int" ,"SetSystemCursor","int",$hWaitCurs[0],"int",$OCR_IBEAM)
    MsgBox(0,"","Wieder Normal machen")
    DllCall("user32.dll", "int" ,"SetSystemCursor","int",$hWaitCurs[0],"int",$OCR_IBEAM)

    [/autoit]

    Mfg Spider

    • Offizieller Beitrag

    Das geht dann so:

    [autoit]

    $hWaitCurs = _LoadCursorFromFile(@WindowsDir & "\cursors\cross.cur")
    If _SetSystemCursor($hWaitCurs, $OCR_IBEAM) Then MsgBox(0, '', 'Cursor gesetzt')

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

    Func _SetSystemCursor($hCur, $id)
    Local $ret = DllCall("user32.dll", "int" ,"SetSystemCursor","int",$hCur,"int",$id)
    Return $ret[0]
    EndFunc

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

    Func _LoadCursorFromFile($lpFileName)
    Local $ret = DllCall("user32", 'long', "LoadCursorFromFileA", 'str', $lpFileName)
    Return $ret[0]
    EndFunc

    [/autoit]