1 (изменено: Indomito, 2015-08-09 02:59:36)

Тема: AHK: Скрытие системного курсора в FullScreenMode

Приветствую.

По сути задача не сложная и она работает в оконном режиме, но программа запускаемая мной не моя.
Достаточно несколько раз выполнить последовательность подпрограмм lMinWinGameKeys и lMaxWinGameKeys и на экране отображаются два курсора - внутрипрограммный и  системный.
Видимо что ещё нужно - имя окна, доп. параметры, etc.

+ Код скрытия курсора
gShowCursor:
  DllCall("ShowCursor", "Int", 1)
  fSHCursor:=0
return
    
gHideCursor:
  DllCall("ShowCursor", "Int", 0)
  fSHCursor:=1
return

lMaxWinGameKeys:
Thread, NoTimers
Critical
  WinActivate, %WinNameCame%
    Sleep, 1000
    Send, {Escape}
  Gosub gHideCursor
Critical , Off
Thread, NoTimers, false 
Return

lMinWinGameKeys:
Thread, NoTimers
Critical 
    Send, {Escape}
    Sleep, 1000
    WinMinimize, A
  Gosub gShowCursor
Critical , Off
Thread, NoTimers, false 
Return

Я, честно говоря, голову сломал, ища аналогичные примеры, но все они относятся к оконному режиму окна.
Отключал и включал режим DSR режим - зависимости нет.
Ставил отключение в секцию таймера - не помогло.

P.S. До написания тестировал в скрипте в оконном режиме - всё работает.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

2 (изменено: Alectric, 2015-08-09 07:50:47)

Re: AHK: Скрытие системного курсора в FullScreenMode

Определяю FullScreen режим окна таким методом:


loop
{
  if isWindowFullScreen(WinExist("A"))
    tooltip,FullScreen
  else
    tooltip,Not
  sleep,1
}

isWindowFullScreen(WinID)
{
  WinGet,WinMinMax,MinMax,ahk_id %WinID%
  WinGetPos,WinX,WinY,WinW,WinH,ahk_id %WinID%
  if (WinMinMax=0 and WinX=0 and WinY=0 and WinW=A_ScreenWidth and WinH=A_ScreenHeight)
  {
    WinGetClass,WinClass,ahk_id %WinID%
    WinGet,WinProcessName,ProcessName,ahk_id %WinID%
    SplitPath,WinProcessName,,,WinProcessExt
    if (WinClass!="Progman") and (WinProcessExt!="scr")
      return true
  }
}
Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

3 (изменено: Alectric, 2015-08-09 08:26:02)

Re: AHK: Скрытие системного курсора в FullScreenMode

Не знаю как у вас, у меня эта функция не скрывает курсор:

f1::
    tooltip,% a:=DllCall("ShowCursor", "Int", 1)
return

f2::
   tooltip,% a:=DllCall("ShowCursor", "Int", 0)
return


Вот эта скрывает, но ужасно глючит.

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

4

Re: AHK: Скрытие системного курсора в FullScreenMode

Alectric

Alectric пишет:

Определяю FullScreen режим окна таким методом:

А как скрывать то?

Alectric пишет:

Не знаю как у вас, у меня эта функция не скрывает курсор:

Она скрывает, но только в окне.

Alectric пишет:

Вот эта скрывает, но ужасно глючит.

А в чём её глюк то?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

5 (изменено: Indomito, 2015-08-09 11:16:27)

Re: AHK: Скрытие системного курсора в FullScreenMode

Alectric Я вот написал так.

+ То что глючит
SystemCursor(0)
MsgBox скрыть курор
SystemCursor(1)
MsgBox показать курсор
SystemCursor(1)
Return

; Example: Hides the mouse cursor when you press Win+C. To later show the cursor, press Win+C again.
; This script is from www.autohotkey.com/forum/topic6107.html

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

;ShowCursor:
;SystemCursor("On")
;ExitApp

;#c::SystemCursor("Toggle")  ; Win+C hotkey to toggle the cursor on and off.

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% )
    }
}

Долго ждал глюка и не дождался.

Если написать SystemCursor("Off") - то реакции не будет, ты про этот глюк?
Просто в таком варианте скрытие плохо отрабатывается, через раз или вообще не скрывает.


P.S. Видимо из за отсутствия CaseSensitive := False и CaseSensitive := True.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

6 (изменено: Indomito, 2015-08-09 11:49:53)

Re: AHK: Скрытие системного курсора в FullScreenMode

Проверил уже на той программе, где два курсора - не помогает... блин.

Опс... забыл её вызывать. Поправил, скрывает и не глючит.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

7 (изменено: Alectric, 2015-08-09 12:26:29)

Re: AHK: Скрытие системного курсора в FullScreenMode

Странный глюк в видеоплеере - скрывает нормально, выхожу из FullScreen'а все курсоры отображаются, кроме основного.
Использовал такой код:

loop
{
  if (!doonce and isWindowFullScreen(WinExist("A")))
  {
    doonce=1
    SystemCursor(0)
    tooltip,FullScreen
  }
  else if (doonce and !isWindowFullScreen(WinExist("A")))
  {
    doonce=
    SystemCursor(1)
    tooltip,Not
  }
  sleep,100
}

isWindowFullScreen(WinID)
{
  WinGet,WinMinMax,MinMax,ahk_id %WinID%
  WinGetPos,WinX,WinY,WinW,WinH,ahk_id %WinID%
  if (WinMinMax=0 and WinX=0 and WinY=0 and WinW=A_ScreenWidth and WinH=A_ScreenHeight)
  {
    WinGetClass,WinClass,ahk_id %WinID%
    WinGet,WinProcessName,ProcessName,ahk_id %WinID%
    SplitPath,WinProcessName,,,WinProcessExt
    if (WinClass!="Progman") and (WinProcessExt!="scr")
      return true
  }
}

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% )
    }
}

...
Да сейчас уже не глючит... странный глюк... ну да ладно, все работает.

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

8

Re: AHK: Скрытие системного курсора в FullScreenMode

А ты видеоплеер запускаешь скриптом и он не выгружается или просто скрыл, а показ курсора другим скриптом?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

9 (изменено: Alectric, 2015-08-09 12:29:29)

Re: AHK: Скрытие системного курсора в FullScreenMode

Кажется понял - видимо две копии скрипта было запущено.

Когда уже до разработчиков дойдет сделать "#SingleInstance" по умолчанию "Force".


...
Хотя нет, две копии запустил - всеравно нормально... и пять копий...
Странный глюк...

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

10 (изменено: Alectric, 2015-08-09 12:39:34)

Re: AHK: Скрытие системного курсора в FullScreenMode

Опять поймал этот глюк - теперь пострадали курсоры изменения размеров окна, скрипты уже давно выключены.

...
Ладно не важно, закрыли тему про глюк, а то оффтоп, да еще и мультипост.

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

11

Re: AHK: Скрытие системного курсора в FullScreenMode

У меня всё работает без ошибок - проверял ни один день.

Проблема решена, её раз спасибо Alectric

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro