Edit: Rectangular cursors/any cursor larger than 32x32 works only in Windows 10.
Pre Window 10, cursor will be resized to 32x32 when passed to SetSystemCursor() API function.
Example:
Code: Select all
#NoEnv
#Warn
#SingleInstance, Force
F1:: BoxCur(128, 64) ; create/apply 128x64 bordered box as system-wide cursor.
F2:: BoxCur() ; restore system cursors.
F3:: BoxCur(128, 64, True) ; create/apply 128x64 filled box as system-wide cursor.
The function:
Code: Select all
BoxCur(P*) { ; v0.3 by SKAN on D47J/D47K @ tiny.cc/boxcur
Local ; Original function name ChooseColors_BoxCur()
If ! ( P.Count() )
Return DllCall("User32.dll\SystemParametersInfo", "Int",SPI_SETCURSORS := 0x57, "Int",0, "Int",0, "Int",0)
CW := Max( 32, Format("{:d}", P[1]) )
CH := Max( 32, Format("{:d}", P[2]) )
RegRead, m, HKEY_CURRENT_USER\Control Panel\Cursors, CursorBaseSize
m := ( (m := Format("{:d}", m)) > 32 ? m/32 : 1 )
CW := Round(CW/m)
CH := Round(CH/m)
VarSetCapacity(BITMAPINFO, 40, 0)
pBMI := &BITMAPINFO, pBits := 0
NumPut(1, NumPut(1,NumPut(CH,NumPut(CW,NumPut(40,pBMI+0,"Int"),"Int"),"Int"),"Short"),"Short")
hBM := DllCall("gdi32.dll\CreateDIBSection", "Ptr",0, "Ptr",pBMI, "Int",0, "PtrP",pBits, "Ptr",0, "Int", 0, "Ptr")
hPen := DllCall("Gdi32.dll\CreatePen", "Int",0, "Int",1, "Int",0xFFFFFF, "Ptr")
hBrush := DllCall("Gdi32.dll\CreateSolidBrush", "Int",m!=1 || P[3]!="" ? 0xFFFFFF : 0x000000, "Ptr")
mDC := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr")
DllCall("Gdi32.dll\SaveDC", "Ptr",mDC)
DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hBrush)
DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hPen)
DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hBM)
DllCall("Gdi32.dll\RoundRect", "Ptr",mDC, "Int",0, "Int",0, "Int",CW, "Int",CH, "Int",0, "Int",0)
DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1)
DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC)
DllCall("Gdi32.dll\DeleteObject", "Ptr",hBrush)
DllCall("Gdi32.dll\DeleteObject", "Ptr",hPen)
VarSetCapacity( BITMAP, SzBITMAP := ( A_PtrSize = 8 ? 32 : 24 ) )
DllCall("Gdi32.dll\GetObject", "Ptr",hBM, "Int",SzBITMAP, "Ptr",&BITMAP)
WB := Numget(BITMAP, 12, "Int")
biSize := (WB*CH) * 2
ttlSize := 22 + 40 + 8 + biSize
pCURSOR := DllCall("Kernel32.dll\GlobalAlloc", "Int",0x40, "Ptr",ttlSize, "Ptr")
NumPut(0x0100020000, pCURSOR + 0, "Int64")
NumPut(CW, pCURSOR + 6, "UChar")
NumPut(CH, pCURSOR + 7, "UChar")
NumPut(40 + 8 + biSize, pCURSOR + 14, "UInt")
NumPut(22, pCURSOR + 18, "UInt")
NumPut(0xFFFFFF, pCURSOR + 66, "UInt")
NumPut(CW, pBMI + 4, "UInt")
NumPut(CH*2, pBMI + 8, "UInt")
NumPut(bisize, pBMI + 20, "UInt")
NumPut(2, pBMI + 32, "UInt")
NumPut(2, pBMI + 36, "UInt")
DllCall("Kernel32.dll\RtlMoveMemory", "Ptr",pCURSOR + 22, "Ptr",pBMI, "Ptr",40)
DllCall("Kernel32.dll\RtlMoveMemory", "Ptr",pCURSOR + 70, "Ptr",pBits, "Ptr",WB*CH)
DllCall("Kernel32.dll\RtlFillMemory", "Ptr",pCURSOR + 70+(WB*CH), "Ptr",(WB*CH), "Int",255)
DllCall("Gdi32.dll\DeleteObject", "Ptr",hBM)
Loop, Parse, % "32512,32513,32514,32515,32516,32640,32641,32642,32643,32644,32645,32646,32648,32649,32650,32651", `,
DllCall("User32.dll\SetSystemCursor", "Ptr",DllCall("User32.dll\CreateIconFromResourceEx", "Ptr",pCURSOR+22
, "UInt",ttlSize-22, "Int",True, "Int",0x30000, "Int",CW, "Int",CH, "Int",0, "Ptr"), "Int",A_Loopfield)
; FileOpen("box.cur", "w").RawWrite(pCURSOR+0, ttlSize)
DllCall("Kernel32.dll\GlobalFree", "Ptr",pCURSOR)
Return ttlSize
}