Ustaw wskaźnik myszy jako niewidoczny na bezczynności

6

Czy istnieje sposób, aby wskaźnik myszy zniknął, gdy komputer stanie się bezczynny? Gdyby rozwiązanie mogło działać zarówno w systemie Windows XP, jak i Windows 7, byłoby świetnie.

Joseph
źródło

Odpowiedzi:

5

Na podstawie tego, co znalazłem tutaj , Udało mi się wykonać następujące czynności AutoHotkey kod:

SystemCursor("Init")

SetTimer, CheckIdle, 250
return

CheckIdle:
TimeIdle := A_TimeIdlePhysical // 1000
if TimeIdle >= 3
{
    SystemCursor("Off")
}
else
{
    SystemCursor("On")
}
return

#Persistent
OnExit, ShowCursor  ; Ensure the cursor is made visible when the script exits.
return

ShowCursor:
SystemCursor("On")
ExitApp

SystemCursor(OnOff=1)   ; INIT = "I","Init"; OFF = 0,"Off"; TOGGLE = -1,"T","Toggle"; ON = others
{
    static AndMask, XorMask, $, h_cursor
        ,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13 ; system cursors
        , b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13   ; blank cursors
        , h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11,h12,h13   ; handles of default cursors
    if (OnOff = "Init" or OnOff = "I" or $ = "")       ; init when requested or at first call
    {
        $ = h                                          ; active default cursors
        VarSetCapacity( h_cursor,4444, 1 )
        VarSetCapacity( AndMask, 32*4, 0xFF )
        VarSetCapacity( XorMask, 32*4, 0 )
        system_cursors = 32512,32513,32514,32515,32516,32642,32643,32644,32645,32646,32648,32649,32650
        StringSplit c, system_cursors, `,
        Loop %c0%
        {
            h_cursor   := DllCall( "LoadCursor", "uint",0, "uint",c%A_Index% )
            h%A_Index% := DllCall( "CopyImage",  "uint",h_cursor, "uint",2, "int",0, "int",0, "uint",0 )
            b%A_Index% := DllCall("CreateCursor","uint",0, "int",0, "int",0
                , "int",32, "int",32, "uint",&AndMask, "uint",&XorMask )
        }
    }
    if (OnOff = 0 or OnOff = "Off" or $ = "h" and (OnOff < 0 or OnOff = "Toggle" or OnOff = "T"))
        $ = b  ; use blank cursors
    else
        $ = h  ; use the saved cursors

    Loop %c0%
    {
        h_cursor := DllCall( "CopyImage", "uint",%$%%A_Index%, "uint",2, "int",0, "int",0, "uint",0 )
        DllCall( "SetSystemCursor", "uint",h_cursor, "uint",c%A_Index% )
    }
}
Joseph
źródło
1

Spróbuj tego: Kursor Hider

ricbax
źródło
1
Tego właśnie szukam, ale 20 $ wydaje się trochę za dużo.
Joseph
1

Jeśli nie masz nic przeciwko temu, że małe kodowanie będzie prawdopodobnie konieczne, możesz użyć AutoHotkey . Widzieć to post na forum, aby uzyskać więcej informacji na temat tego, co chcesz osiągnąć.

sYnfo
źródło
Wpis, który powiązałeś, powoduje, że mysz jest niewidoczna w utworzonej aplikacji AutoHotkey. Mam mnie jednak na dobrej drodze, więc dam ci głos. Dzięki.
Joseph
1

8 lat i Józefa odpowiedź jest nadal dobra i działa w AHK! ALE zrobiłem to jeszcze lepiej .. moim zdaniem przyczyny.

Dodałem czek myszy, aby kursor pokazywał się ponownie dopiero po przeniesieniu. Prawda, że ​​mogłem dodać inne zdarzenia myszy, takie jak kliknięcia, ale ponieważ kursor jest ukryty, myślę, że to zbyt trudne, by się tym przejmować. Możesz dodać go sam, jeśli chcesz :)

To, co zmieniłem, to ruch #Persistent do góry, ponieważ jest globalny i obecny dla całego skryptu bez względu na to, czy jest.

Dodany CoordMode, Mouse, Screen i MouseGetPos, ix, iy w sekcji autoexec i MouseGetPos, ix, iy ponownie, gdy idziesz do bezczynności. MouseGetPos, cx, cy zostaje ustawiony na każdy CheckIdle a zmienne są porównywane przy ruchu myszy if (cx != ix or cy != iy).

#Persistent

CoordMode, Mouse, Screen
MouseGetPos, ix, iy

SystemCursor("Init")

SetTimer, CheckIdle, 250
return

CheckIdle:
MouseGetPos, cx, cy
TimeIdle := A_TimeIdlePhysical // 1000
if (TimeIdle >= 3)
{
    MouseGetPos, ix, iy
    SystemCursor("Off")
}
else if (cx != ix or cy != iy)
{
    SystemCursor("On")
}
return

OnExit, ShowCursor  ; Ensure the cursor is made visible when the script exits.
return

ShowCursor:
SystemCursor("On")
ExitApp

SystemCursor(OnOff=1)   ; INIT = "I","Init"; OFF = 0,"Off"; TOGGLE = -1,"T","Toggle"; ON = others
{
    static AndMask, XorMask, $, h_cursor
        ,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13 ; system cursors
        , b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13   ; blank cursors
        , h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11,h12,h13   ; handles of default cursors
    if (OnOff = "Init" or OnOff = "I" or $ = "")       ; init when requested or at first call
    {
        $ = h                                          ; active default cursors
        VarSetCapacity( h_cursor,4444, 1 )
        VarSetCapacity( AndMask, 32*4, 0xFF )
        VarSetCapacity( XorMask, 32*4, 0 )
        system_cursors = 32512,32513,32514,32515,32516,32642,32643,32644,32645,32646,32648,32649,32650
        StringSplit c, system_cursors, `,
        Loop %c0%
        {
            h_cursor   := DllCall( "LoadCursor", "uint",0, "uint",c%A_Index% )
            h%A_Index% := DllCall( "CopyImage",  "uint",h_cursor, "uint",2, "int",0, "int",0, "uint",0 )
            b%A_Index% := DllCall("CreateCursor","uint",0, "int",0, "int",0
                , "int",32, "int",32, "uint",&AndMask, "uint",&XorMask )
        }
    }
    if (OnOff = 0 or OnOff = "Off" or $ = "h" and (OnOff < 0 or OnOff = "Toggle" or OnOff = "T"))
        $ = b  ; use blank cursors
    else
        $ = h  ; use the saved cursors

    Loop %c0%
    {
        h_cursor := DllCall( "CopyImage", "uint",%$%%A_Index%, "uint",2, "int",0, "int",0, "uint",0 )
        DllCall( "SetSystemCursor", "uint",h_cursor, "uint",c%A_Index% )
    }
}
micnolmad
źródło