Тема: AHK: Замена системного курсора изображением хранящимся в виде Hex
По мотивам сообщения
К сожалению, ссылки в посте выше не актуальны.
; http://www.autohotkey.com/forum/topic35600.html
#SingleInstance Force
~MButton::SetSystemCursor(A_ScriptDir "\blank.cur")
~MButton Up::RestoreCursors()
SetSystemCursor(Cursor)
{
CursorHandle := DllCall("LoadCursorFromFile", Str, Cursor)
DllCall("SetSystemCursor", Uint, CursorHandle, Int, "32512")
}
RestoreCursors()
{
SPI_SETCURSORS := 0x57
DllCall("SystemParametersInfo", UInt, SPI_SETCURSORS, UInt, 0, UInt, 0, UInt, 0)
}
Курсор: blank.cur
При нажатии Mbutton системный «Arrow» замещается приложенным «пустым» курсором, при отпускании – восстанавливается первоначальное состояние.
Есть желание избавиться от «лишнего файла», поместив blank.cur в тело скрипта, но нет достаточных для выполнения задачи знаний.
Как установить курсор сохранённый в виде Hex данных в переменной?
Добавлено:
Требуемая функциональность обеспечивается примером из справки. Модифицированный вариант:
Space::ToggleSystemCursor()
ToggleSystemCursor() {
static state
static Cursors := [
(Join,
[32512], [32513], [32514], [32515]
[32516], [32642], [32643], [32644]
[32645], [32646], [32648], [32649]
[32650], [32651], [32641], [32640]
)]
(state = "") && InitCursors(Cursors)
handle := (state := !state)? "blank":"default"
loop % Cursors.MaxIndex() {
Cursor := Cursors[A_Index]
hImage := CopyCursorImage(Cursor[handle])
DllCall("SetSystemCursor"
, "Ptr", hImage
, "UInt", Cursor[1])
}
}
InitCursors(Cursors) {
loop % Cursors.MaxIndex() {
Cursor := Cursors[A_Index]
if !cursorInstance := DllCall("LoadCursor"
, "Ptr", 0
, "Ptr", Cursor[1])
{
Cursors.Remove(A_Index)
continue
}
Cursor.default := CopyCursorImage(cursorInstance)
Cursor.blank := CreateBlankCursor()
}
}
CreateBlankCursor() {
static andMask, xorMask
static initAndMask := VarSetCapacity(andMask, 32*4, 0xFF)
static initXorMask := VarSetCapacity(xorMask, 32*4, 0)
return DllCall("CreateCursor"
, "Ptr", 0
, "Int", 0
, "Int", 0
, "Int", 32
, "Int", 32
, "Ptr", &andMask
, "Ptr", &xorMask)
}
CopyCursorImage(ByRef cursorInstance) {
return DllCall("CopyImage"
, "Ptr", cursorInstance
, "UInt", 2
, "Int", 0
, "Int", 0
, "UInt", 0)
}