jennico Posted April 29, 2007 Share Posted April 29, 2007 hi there, i am using this function i found in the forum to change the cursor icon within a game: Global Const $OCR_APPSTARTING = 32650 Global Const $OCR_NORMAL = 32512 Global Const $OCR_CROSS = 32515 Global Const $OCR_HAND = 32649 Global Const $OCR_IBEAM = 32513 Global Const $OCR_NO = 32648 Global Const $OCR_SIZEALL = 32646 Global Const $OCR_SIZENESW = 32643 Global Const $OCR_SIZENS = 32645 Global Const $OCR_SIZENWSE = 32642 Global Const $OCR_SIZEWE = 32644 Global Const $OCR_UP = 32516 Global Const $OCR_WAIT = 32514 ;~ _SetCursor(@WindowsDir & "\cursors\3dgarro.cur", $OCR_NORMAL) ;~ _SetCursor(@WindowsDir & "\cursors\3dwarro.cur", $OCR_NORMAL) _SetCursor(@WindowsDir & "\cursors\banana.ani", $OCR_NORMAL) ;================================================================== ; $s_file - file to load cursor from ; $i_cursor - system cursor to change ;================================================================== 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 this works fine. but - does anyone know how i can reset the cursor to the default (previous) on program exit ? thanx in advance j. Spoiler I actively support Wikileaks | Freedom for Julian Assange ! | Defend freedom of speech ! | Fight censorship ! | I will not silence.Don't forget this IP: 213.251.145.96 Link to comment Share on other sites More sharing options...
Shevilie Posted April 29, 2007 Share Posted April 29, 2007 http://www.autoitscript.com/autoit3/docs/f...seGetCursor.htmHere you should be able to get the cursor and then save it for the exit of the program.. Start here if you are new Valuater's AutoIT 1-2-3Looking for an UDF - Look hereDo you need to do it twice - Autoit Link to comment Share on other sites More sharing options...
Zedna Posted April 30, 2007 Share Posted April 30, 2007 Solution is in OnAutoitExit call DllCall("user32.dll", "hwnd", "LoadCursor", "hwnd", 0, 'int', $IDC_ARROW)oÝ÷ Ù©ÝIëRÊË^+«²ÒyâèiЮ®Ê+jÓÒ ªÞ¦·yø§yÛ-jwZ×.®Ê+²«z+&¢·¢je{±jjey«¢+Ù ½¹ÍÐÀÌØí% }II=ôÌÈÔÄÈ()±½° ½¹ÍÐÀÌØí= I}AAMQIQ%9ôÌÈØÔÀ)±½° ½¹ÍÐÀÌØí= I}9=I50ôÌÈÔÄÈ)±½° ½¹ÍÐÀÌØí= I} I=MLôÌÈÔÄÔ)±½° ½¹ÍÐÀÌØí= I}!9ôÌÈØÐä)±½° ½¹ÍÐÀÌØí= I}% 4ôÌÈÔÄÌ)±½° ½¹ÍÐÀÌØí= I}9 Resources UDF ResourcesEx UDF AutoIt Forum Search Link to comment Share on other sites More sharing options...
Bert Posted April 30, 2007 Share Posted April 30, 2007 (edited) I hate to hijack this, but I'm looking for a middle finger cursor. I know about the joke program, but my antivirus deletes to on the spot. I'm looking for the cur file. anybody got it? edit....found it.....disregard. Edited April 30, 2007 by Volly The Vollatran project My blog: http://www.vollysinterestingshit.com/ Link to comment Share on other sites More sharing options...
jennico Posted April 30, 2007 Author Share Posted April 30, 2007 (edited) hi zedna, Func _SetStdCursor($i_idc_cursor, $i_cursor) Local $newhcurs, $lResult $newhcurs = DllCall("user32.dll", "hwnd", "LoadCursor", "hwnd", 0, 'int', $i_idc_cursor) If Not @error Then $lResult = DllCall("user32.dll", "int", "SetSystemCursor", "int", $newhcurs[0], "int", $i_cursor) If @error Then MsgBox(0, "Error", "Failed SetSystemCursor") EndIf Else MsgBox(0, "Error", "Failed LoadCursor") EndIf EndFunc;==>_SetStdCursor this sounds fine. didn't know the hwnd. try tomorrow. @ Shevilie: this is not quite the problem. i don't need the cursor ID but i think zedna has the right answer. at least i can reset to system cursor - but still it's not possible to return a custom cursor set, i guess ? just in case someone who plays my game has altered the system cursor before..... in this case i should better be able to save the current cursor set on game start. is that possible ? thank you all j. Edited April 30, 2007 by jennico Spoiler I actively support Wikileaks | Freedom for Julian Assange ! | Defend freedom of speech ! | Fight censorship ! | I will not silence.Don't forget this IP: 213.251.145.96 Link to comment Share on other sites More sharing options...
Zedna Posted April 30, 2007 Share Posted April 30, 2007 but i think zedna has the right answer. at least i can reset to system cursor - but still it's not possible to return a custom cursor set, i guess ? just in case someone who plays my game has altered the system cursor before.....in this case i should better be able to save the current cursor set on game start. is that possible ?thank you allj.What about GetCursor() API?See: MSDN Resources UDF ResourcesEx UDF AutoIt Forum Search Link to comment Share on other sites More sharing options...
jennico Posted April 30, 2007 Author Share Posted April 30, 2007 wow, i don't like this msdn, but i will work myself thru..... :-) thanx j. Spoiler I actively support Wikileaks | Freedom for Julian Assange ! | Defend freedom of speech ! | Fight censorship ! | I will not silence.Don't forget this IP: 213.251.145.96 Link to comment Share on other sites More sharing options...
jennico Posted April 30, 2007 Author Share Posted April 30, 2007 well, i read it. so anyone who can translate HCURSOR GetCursor(VOID) and BOOL GetCursorInfo( PCURSORINFO pci ); into autoit for me ? i am not so specialised yet.... :-( j. Spoiler I actively support Wikileaks | Freedom for Julian Assange ! | Defend freedom of speech ! | Fight censorship ! | I will not silence.Don't forget this IP: 213.251.145.96 Link to comment Share on other sites More sharing options...
Zedna Posted April 30, 2007 Share Posted April 30, 2007 well, i read it. so anyone who can translate HCURSOR GetCursor(VOID) and BOOL GetCursorInfo( PCURSORINFO pci ); into autoit for me ? i am not so specialised yet.... :-( j. HCURSOR GetCursor(VOID); $hcursor = DllCall("user32.dll", "hwnd", "GetCursor") Resources UDF ResourcesEx UDF AutoIt Forum Search Link to comment Share on other sites More sharing options...
jennico Posted April 30, 2007 Author Share Posted April 30, 2007 thanx again, i am really sorry for my innocent scripting soul, but i will be learning these things. muchas gracias Spoiler I actively support Wikileaks | Freedom for Julian Assange ! | Defend freedom of speech ! | Fight censorship ! | I will not silence.Don't forget this IP: 213.251.145.96 Link to comment Share on other sites More sharing options...
Zedna Posted April 30, 2007 Share Posted April 30, 2007 well, i read it. so anyone who can translate BOOL GetCursorInfo( PCURSORINFO pci ); typedef struct { DWORD cbSize; DWORD flags; HCURSOR hCursor; POINT ptScreenPos; } CURSORINFO, *PCURSORINFO, *LPCURSORINFO; $struct = DllStructCreate("dword;dword;hwnd;long;long") DllStructSetData($struct,1, DllStructGetSize($struct)) $return = DllCall("user32.dll", "int", "GetCursorInfo", "ptr", DllStructGetPtr($struct)) If $return[0] = 0 Then MsgBox(48,'Error','Error code = ' & $return[0]) Else MsgBox(0,'Info','Flag = ' & DllStructGetData($struct,2) & @CRLF & 'Handle = ' & DllStructGetData($struct,3) & @CRLF & _ 'Pos.X = ' & DllStructGetData($struct,4) & @CRLF & 'Pos.Y = ' & DllStructGetData($struct,5) ) EndIf $struct = 0 Resources UDF ResourcesEx UDF AutoIt Forum Search Link to comment Share on other sites More sharing options...
jennico Posted April 30, 2007 Author Share Posted April 30, 2007 wow in this way i can study very well. merci beaucoup. Spoiler I actively support Wikileaks | Freedom for Julian Assange ! | Defend freedom of speech ! | Fight censorship ! | I will not silence.Don't forget this IP: 213.251.145.96 Link to comment Share on other sites More sharing options...
jennico Posted August 10, 2007 Author Share Posted August 10, 2007 (edited) hello zedna and others ! i'm returning to the problem again. the advanced script you offered unfortunately does not return the standard cursors. in fact nothing happens. Func _SetStdCursor($i_idc_cursor, $i_cursor) Local $newhcurs, $lResult $newhcurs = DllCall("user32.dll", "hwnd", "LoadCursor", "hwnd", 0, 'int', $i_idc_cursor) If Not @error Then $lResult = DllCall("user32.dll", "int", "SetSystemCursor", "int", $newhcurs[0], "int", $i_cursor) If @error Then MsgBox(0, "Error", "Failed SetSystemCursor") EndIf Else MsgBox(0, "Error", "Failed LoadCursor") EndIf EndFunc;==>_SetStdCursor i assume the line $newhcurs = DllCall("user32.dll", "hwnd", "LoadCursor", "hwnd", 0, 'int', $i_idc_cursor) is not correct. maybe someone can work it over once more. i found lots of entries in the forum concerning the setcursor-setstdcursor problem but no solution so far. meanwhile i scripted a workaround using the control panel, opening the mouse properties and hence reset them to default. this scrippet can be attached to the exit of the program. it will reestablish the standard cursors and works quite secure. thus still it's a bit clumsy, but the best way to to do it until someone finds the right dll call thing. i add my few lines here. the script works on a german system, so all others than germans have to translate the commented parts into their language. the script works with the status bar information, in case the status bar isn't turned on this will automatically be done. Opt("SendKeyDelay",1) Run("control panel") Do; translate these comments into your language WinActivate("Systemsteuerung"); <= 'control panel' Until WinActive("Systemsteuerung"); <= 'control panel' Do WinActivate("Systemsteuerung"); <= 'control panel' Send("m"); <= 'm' for mouse $a=StatusbarGetText("Systemsteuerung"); <= 'control panel' If $a="" Then WinActivate("Systemsteuerung"); <= 'control panel' Send("!a{DOWN}{ENTER}"); <= the "!a" might be "!v" for 'View' in English EndIf Until StringLeft($a,5)="Passt"; <= 'fits (?)' <= status bar info when 'mouse' clicked WinActivate("Systemsteuerung"); <= 'control panel' Send("{ENTER}") Do WinActivate("Eigenschaften von Maus"); <= 'mouse properties' Until WinActive("Eigenschaften von Maus"); <= 'mouse properties' Send("^{TAB}{ENTER}") WinClose("Systemsteuerung"); <= 'control panel' Exit so pls help anyone with the dll call, because my script is a bit clumsy. so long and i hope you like my workaround in the meantime. j. Edited August 13, 2007 by jennico Spoiler I actively support Wikileaks | Freedom for Julian Assange ! | Defend freedom of speech ! | Fight censorship ! | I will not silence.Don't forget this IP: 213.251.145.96 Link to comment Share on other sites More sharing options...
ibon Posted December 17, 2007 Share Posted December 17, 2007 (edited) Alas, due to a bug(?) in SetSystemCursor(), you should copy a cursor handle before calling the SetSystemCursor. Give a replica into the monster instead of the original. In other words, SetSystemCursor() deletes cursor handle after it changed the cursor figure. expandcollapse popupGlobal Const $OCR_IBEAM = 32513 Global $hCursor, $hOriginalIBeam, $hCopyCursor $userDll = DllOpen( "user32.dll" ) $hOriginalIBeam = DllCall( $userDll, "ptr", "LoadCursorFromFile", "str", @WindowsDir & "\Cursors\beam_r.cur" ) $hCursor = DllCall( $userDll, "ptr", "LoadCursorFromFile", "str", @ScriptDir & "\banana.cur" ) If $hCursor[0] = 0 Then MsgBox( 0, "Exception", "Please, put a cursor file 'banana.cur' into the script folder." ) EndIf $hCopyCursor = DllCall( $userDll, "ptr", "CopyImage", "ptr", $hCursor[0], "uint", 2, "int", 0, "int", 0, "uint", 0 ) DllCall( $userDll, "ptr", "SetSystemCursor", "ptr", $hCopyCursor[0], "int", $OCR_IBEAM ) Sleep( 3000 ) $hCopyCursor = DllCall( $userDll, "ptr", "CopyImage", "ptr", $hOriginalIBeam[0], "uint", 2, "int", 0, "int", 0, "uint", 0 ) DllCall( $userDll, "ptr", "SetSystemCursor", "ptr", $hCopyCursor[0], "int", $OCR_IBEAM ) Sleep( 3000 ) ; without the CopyImage(), the following SetSystemCursor()s won't work $hCopyCursor = DllCall( $userDll, "ptr", "CopyImage", "ptr", $hCursor[0], "uint", 2, "int", 0, "int", 0, "uint", 0 ) DllCall( $userDll, "ptr", "SetSystemCursor", "ptr", $hCopyCursor[0], "int", $OCR_IBEAM ) Sleep( 3000 ) $hCopyCursor = DllCall( $userDll, "ptr", "CopyImage", "ptr", $hOriginalIBeam[0], "uint", 2, "int", 0, "int", 0, "uint", 0 ) DllCall( $userDll, "ptr", "SetSystemCursor", "ptr", $hCopyCursor[0], "int", $OCR_IBEAM ) Sleep( 3000 ) DllCall( $userDll, "int", "DestroyCursor", "ptr", $hCursor[0] ) DllCall( $userDll, "int", "DestroyCursor", "ptr", $hOriginalIBeam[0] ) DllClose( $userDll ) Edited December 17, 2007 by ibon Link to comment Share on other sites More sharing options...
cherdeg Posted November 17, 2008 Share Posted November 17, 2008 This one works: Global Const $OCR_NORMAL = 32512 Global Const $OCR_IBEAM = 32513 Global Const $OCR_WAIT = 32514 $GUI = GuiCreate("test") GUISetState() Local $hWaitCur $hWaitCur = _LoadCursor($OCR_WAIT) _SetSystemCursor($hWaitCur,$OCR_NORMAL) While 1 If GUIGetMsg() = -3 Then ExitLoop sleep(10) WEnd _SetSystemCursor($hWaitCur,$OCR_NORMAL) $hWaitCur = 0 Func _LoadCursor($iCursor) Return SetError(@error,@extended ,_API(DllCall("user32.dll", "int", "LoadCursorA", "hwnd", 0, "int", $iCursor))) EndFunc ;==>_LoadCursor Func _SetSystemCursor($hCursor,$iCursor) Return SetError(@error,@extended ,_API(DllCall("user32.dll", "int" ,"SetSystemCursor","int",$hCursor,"int",$iCursor))) EndFunc Func _API($v_ret) Local $err = @error Local $ext = @extended If Not $err Then If IsArray($v_ret) Then Return $v_ret[0] Else Return $v_ret EndIf EndIf Return SetError($err, $ext, 0) EndFunc ;==>_API Link to comment Share on other sites More sharing options...
jennico Posted May 1, 2009 Author Share Posted May 1, 2009 the solution is easy: to reset cursor to default, use: Global Const $SPI_SETCURSORS = 0x57 DllCall("user32.dll", "int", "SystemParametersInfo", "int", $SPI_SETCURSORS, "int", 0, "int", 0, "int", 0) cheers j Spoiler I actively support Wikileaks | Freedom for Julian Assange ! | Defend freedom of speech ! | Fight censorship ! | I will not silence.Don't forget this IP: 213.251.145.96 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now