Search code examples
pythonregistryautohotkey

How to Change the icon Mouse Pointer if i Hover a coordinate area


How can i Change the icon from the Mouse Pointer.

I want this : if i Hover with my Mouse Device a special x,y coordinate area, that it will automatic change the icon of the Mouse Pointer (if i reach that area) and if i go outsite that area it must change it back to the default icon.

I have did try to make the code with autohotkey Languages.

But this does not work.

1 - I need to press the F7 key on my keyboard.

2 - And i must restart my computer for changing the icon of my mouse pointer.

f7::
RegWrite, REG_SZ, HKEY_CURRENT_USER, Control Panel\Cursors\,Arrow,%SystemRoot%\cursors\aero_link.cur
return

(If you have a Code example that is writing in other Scripting Languages like Python or Msdos that is for me ok.)


Solution

  • AutoHotkey - The code below is showing that you can change cursor at a fixed location, in this case the middle of of the screen. How this was accomplished was by using built variables A_screenHeight and A_screenWidth to define Upper/Lower and Right/Left bounds. Then using a Timer and checking if our cursor was within those bounds by using the GetMousePos command. If the mouse is within bounds a function SetSystemCursor(), coded by Serenity on AutoHotkey Forums, is called, this function uses various DllCall's to change cursor.

    #Persistent
    #SingleInstance Force
    
    CoordMode, Mouse, Screen
    
    Left := Round((A_screenWidth / 2) / 2)
    Right := Left * 3
    Up := Round((A_screenHeight / 2) / 2)
    Down := Up * 3
    
    SetTimer, WatchCursor, 100
    OnExit, CleanUp
    return
    
    WatchCursor:
    MouseGetPos, x, y 
    If (x >= Left && y >= Up && x <= Right && y <= Down) 
        applied ?: SetSystemCursor("IDC_CROSS"), applied := true
    else 
        (!applied) ?: RestoreCursors(), applied := false
    return
    
    cleanUp:
    RestoreCursors()
    ExitApp
    Return
    
    esc::GoSub, CleanUp
    
    
    
    ; https://autohotkey.com/board/topic/32608-changing-the-system-cursor/
    SetSystemCursor( Cursor = "", cx = 0, cy = 0 ) 
    {
        BlankCursor := 0, SystemCursor := 0, FileCursor := 0 ; init
    
        SystemCursors = 32512IDC_ARROW,32513IDC_IBEAM,32514IDC_WAIT,32515IDC_CROSS
        ,32516IDC_UPARROW,32640IDC_SIZE,32641IDC_ICON,32642IDC_SIZENWSE
        ,32643IDC_SIZENESW,32644IDC_SIZEWE,32645IDC_SIZENS,32646IDC_SIZEALL
        ,32648IDC_NO,32649IDC_HAND,32650IDC_APPSTARTING,32651IDC_HELP
    
        If Cursor = ; empty, so create blank cursor 
        {
            VarSetCapacity( AndMask, 32*4, 0xFF ), VarSetCapacity( XorMask, 32*4, 0 )
            BlankCursor = 1 ; flag for later
        }
        Else If SubStr( Cursor,1,4 ) = "IDC_" ; load system cursor
        {
            Loop, Parse, SystemCursors, `,
            {
                CursorName := SubStr( A_Loopfield, 6, 15 ) ; get the cursor name, no trailing space with substr
                CursorID := SubStr( A_Loopfield, 1, 5 ) ; get the cursor id
                SystemCursor = 1
                If ( CursorName = Cursor )
                {
                    CursorHandle := DllCall( "LoadCursor", Uint,0, Int,CursorID )   
                    Break                   
                }
            }   
            If CursorHandle = ; invalid cursor name given
            {
                Msgbox,, SetCursor, Error: Invalid cursor name
                CursorHandle = Error
            }
        }   
        Else If FileExist( Cursor )
        {
            SplitPath, Cursor,,, Ext ; auto-detect type
            If Ext = ico 
                uType := 0x1    
            Else If Ext in cur,ani
                uType := 0x2        
            Else ; invalid file ext
            {
                Msgbox,, SetCursor, Error: Invalid file type
                CursorHandle = Error
            }       
            FileCursor = 1
        }
        Else
        {   
            Msgbox,, SetCursor, Error: Invalid file path or cursor name
            CursorHandle = Error ; raise for later
        }
        If CursorHandle != Error 
        {
            Loop, Parse, SystemCursors, `,
            {
                If BlankCursor = 1 
                {
                    Type = BlankCursor
                    %Type%%A_Index% := DllCall( "CreateCursor"
                    , Uint,0, Int,0, Int,0, Int,32, Int,32, Uint,&AndMask, Uint,&XorMask )
                    CursorHandle := DllCall( "CopyImage", Uint,%Type%%A_Index%, Uint,0x2, Int,0, Int,0, Int,0 )
                    DllCall( "SetSystemCursor", Uint,CursorHandle, Int,SubStr( A_Loopfield, 1, 5 ) )
                }           
                Else If SystemCursor = 1
                {
                    Type = SystemCursor
                    CursorHandle := DllCall( "LoadCursor", Uint,0, Int,CursorID )   
                    %Type%%A_Index% := DllCall( "CopyImage"
                    , Uint,CursorHandle, Uint,0x2, Int,cx, Int,cy, Uint,0 )     
                    CursorHandle := DllCall( "CopyImage", Uint,%Type%%A_Index%, Uint,0x2, Int,0, Int,0, Int,0 )
                    DllCall( "SetSystemCursor", Uint,CursorHandle, Int,SubStr( A_Loopfield, 1, 5 ) )
                }
                Else If FileCursor = 1
                {
                    Type = FileCursor
                    %Type%%A_Index% := DllCall( "LoadImageA"
                    , UInt,0, Str,Cursor, UInt,uType, Int,cx, Int,cy, UInt,0x10 ) 
                    DllCall( "SetSystemCursor", Uint,%Type%%A_Index%, Int,SubStr( A_Loopfield, 1, 5 ) )         
                }          
            }
        }   
    }
    
    RestoreCursors() 
    {
       SPI_SETCURSORS := 0x57
       DllCall( "SystemParametersInfo", UInt,SPI_SETCURSORS, UInt,0, UInt,0, UInt,0 )
    }