Python 如果将鼠标悬停在坐标区域,如何更改图标鼠标指针

Python 如果将鼠标悬停在坐标区域,如何更改图标鼠标指针,python,registry,autohotkey,Python,Registry,Autohotkey,如何从鼠标指针更改图标 我希望这样:如果我将鼠标设备悬停在一个特殊的x,y坐标区域,它将自动更改鼠标指针的图标(如果我到达该区域),如果我离开该区域,它必须将其更改回默认图标 我确实尝试过用自动热键语言编写代码 但这是行不通的 1-我需要按键盘上的F7键 2-我必须重新启动计算机才能更改鼠标指针的图标 f7:: RegWrite, REG_SZ, HKEY_CURRENT_USER, Control Panel\Cursors\,Arrow,%SystemRoot%\cursors\aero_l

如何从鼠标指针更改图标

我希望这样:如果我将鼠标设备悬停在一个特殊的x,y坐标区域,它将自动更改鼠标指针的图标(如果我到达该区域),如果我离开该区域,它必须将其更改回默认图标

我确实尝试过用自动热键语言编写代码

但这是行不通的

1-我需要按键盘上的F7键

2-我必须重新启动计算机才能更改鼠标指针的图标

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

(如果您有一个用其他脚本语言(如Python或Msdos)编写的代码示例,这对我来说没问题。)

自动热键-下面的代码显示您可以在屏幕中间的固定位置更改光标。这是通过使用内置变量A_screenHeight和A_screenWidth来定义上/下和右/左边界实现的。然后使用计时器并使用GetMousePos命令检查光标是否在这些范围内。如果鼠标在边界内,则调用由Serenity在AutoHotkey论坛上编写的函数SetSystemCursor(),此函数使用各种DllCall来更改光标

#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 )
}
#持久
#单实例力
协作模式、鼠标、屏幕
左:=圆形((A_屏幕宽度/2)/2)
右:=左*3
向上:=圆形((A_屏幕高度/2)/2)
向下:=向上*3
设置计时器,监视光标,100
OnExit,清理
返回
监视光标:
鼠标,x,y

如果(x>=Left&&y>=Up&&x@ahkcoder这正是我所要寻找的,我确实测试了它——它是有效的。我在我的Win注册表中对它进行了比较。(如果我到达该区域)IDC_CROSS是将更改为CROSS_r.cur HKEY_CURRENT_USER\Control Panel\Cursors\Crosshair\%SystemRoot%\Cursors\CROSS_r.cur的图标,如果我想更改该图标,则可以将IDC_CROSS替换为IDC_HAND-in代码行:applied?:SetSystemCursor(“IDC_CROSS”),applicated:=true IDC\u HAND是随后将更改为aero\u link.cur HKEY\u CURRENT\u USER\Control Panel\Cursors\HAND\%SystemRoot%\Cursors\aero\u link.curYes的图标。只需将传递到SetSystemCursor()的值更改为SetSystemCursor(“IDC\u HAND”)。系统图标列表:IDC\u ARROW IDC\u IBEAM IDC\u WAIT IDC\u CROSS IDC\u UPARROW IDC\u SIZENWSE IDC\u SIZENESW IDC\u SIZEWE IDC\u SIZENS IDC\u NO IDC\u HAND IDC\u APPSTARTING IDC\u HELP您能接受回答吗?添加了一些额外的代码以减少对恢复程序和onexit子程序的功能调用为了保证光标被还原。@ahkcoderAbout accept Answeed-我是新来的,我现在确实知道了如何接受答案-首先我确实认为如果你在堆栈溢出上给出一个提示,它将自动接受答案,但你需要按下v图标,然后它将接受,并将变为绿色。可能在t中未来的堆栈溢出确实会改变网站,从而更好地向用户解释如何做到这一点。感谢您的接受!我知道有些功能并不明显,我建议您查看