AutoHotkey - Der folgende Code zeigt, dass Sie den Cursor ändern an einem festen Ort, in diesem Fall die Mitte des Bildschirms. Wie dies erreicht wurde, wurde durch die Verwendung der gebauten Variablen A_screenHeight und A_screenWidth zur Definition der oberen/unteren und rechten/linken Grenzen. Dann verwenden Sie einen Timer und überprüfen, ob sich unser Cursor innerhalb dieser Grenzen befand, indem Sie den Befehl GetMousePos verwenden. Wenn die Maus innerhalb der Grenzen ist, wird die Funktion SetSystemCursor(), die von Serenity in AutoHotkey-Foren codiert wird, aufgerufen. Diese Funktion verwendet verschiedene DllCalls, um den Cursor zu ändern.
#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)
}
@ahkcoderDas ist genau was ich gesucht habe, ich habe es getestet - und es funktioniert. Ich habe es in meiner Win Registry verglichen. (wenn ich diesen Bereich erreichen) IDC_CROSS ist das Symbol, das in cross_r.cur HKEY_CURRENT_USER \ Control Panel \ Cursors \ Fadenkreuz \% SystemRoot% \ Cursors geändert werden \ cross_r.cur und wenn ich möchte, dass die sich ändern Symbol. dann i IDC_CROSS in IDC_HAND in Kodierzeilen ersetzen: angewendet: SetSystemCursor ("IDC_CROSS"), angewendet: = true IDC_HAND das Symbol ist, das in aero_link.cur geändert HKEY_CURRENT_USER \ Control Panel \ Cursors wird dann \ Hand \% SystemRoot% \ cursors \ aero_link.cur – stevecody
Ja, ändern Sie einfach den in SetSystemCursor() übergebenen Wert zu SetSystemCursor ("IDC_HAND"). Eine Liste von System-Icons: IDC_ARROW IDC_IBEAM IDC_WAIT IDC_CROSS IDC_UPARROW IDC_SIZE IDC_ICON IDC_SIZENWSE IDC_SIZENESW IDC_SIZEWE IDC_SIZENS IDC_SIZEALL IDC_NO IDC_HAND IDC_APPSTARTING IDC_HELP Können Sie das bitte akzeptieren, wie Beantwortet ? – errorseven
Zusätzlicher Code zum Reduzieren von Funktionsaufrufen zu restorecursors und eine onexit-Unterroutine hinzugefügt, um sicherzustellen, dass der Cursor wiederhergestellt wird. – errorseven