1

Тема: AHK:Активация окна при наведении курсора на ярлык. Несколько мониторов

Приветствую всех.
Вот у меня есть скрипт - активации окон - по наведению курсора на их ярлыки в панели задач.
Все работает хорошо.

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



#Persistent
prID := -1
hShellTray := WinExist("ahk_class Shell_TrayWnd ahk_exe explorer.exe") 
ControlGet, hTaskbar, HWND,, MSTaskListWClass1, % "ahk_id" hShellTray
DllCall("LoadLibrary","Str","oleacc","Ptr") 

MouseGet:
    MouseGetPos, , , , hCtrl, 2 
    If (hCtrl != hTaskbar)
        prID := -1
    Else If ((ID := AccIDUnderMouse()) && ID != prID && (prID := ID))
    { 
        WinActivate % "ahk_id" hShellTray
        SendInput ^{LButton}{LControl Up}
    }  
    SetTimer, MouseGet, -10
    Return
    
AccIDUnderMouse()   { 
    If DllCall("oleacc\AccessibleObjectFromPoint"
        , "Int64", 0*DllCall("GetCursorPos","Int64*",pt)+pt, "Ptr*", pacc
        , "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild) = 0 
    Return NumGet(varChild,8,"UInt") 
}

2

Re: AHK:Активация окна при наведении курсора на ярлык. Несколько мониторов

Что у вас такой код показывает, когда включено больше одного монитора?

WinGet, List, List, ahk_class Shell_TrayWnd
MsgBox, % List
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK:Активация окна при наведении курсора на ярлык. Несколько мониторов

teadrinker показывает цифру "1"

4

Re: AHK:Активация окна при наведении курсора на ярлык. Несколько мониторов

А мониторы настроены, как один виртуальный рабочий стол, или это независимые рабочие столы?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK:Активация окна при наведении курсора на ярлык. Несколько мониторов

teadrinker, нет - это несколько рабочих столов.
На каждом есть своя панель задач.
ПринтСкрин выдает фот такое изображение:

https://a.radikal.ru/a41/1811/28/81996a0bc43f.jpg

Щелчок ActiveWindow Info - на панели задач главного монитора - выдает название элемента: "ClassNN:MSTaskListWClass1"
А щелчок на панели задач второстепенного монитора - выдает название: "ClassNN:ToolbarWindow321"

6

Re: AHK:Активация окна при наведении курсора на ярлык. Несколько мониторов

OlegSmirnov пишет:

А щелчок на панели задач второстепенного монитора - выдает название: "ClassNN:ToolbarWindow321"

Если наведёте курсор на область трея в панели задач главного монитора — думаю, выдаст то же самое. Здесь нас интересует не ClassNN, а класс окна (ahk_class).
Попробуйте так:

#Persistent
prID := -1 
DllCall("LoadLibrary","Str","oleacc","Ptr") 

MouseGet:
    MouseGetPos,,, hWnd
    WinGetClass, winClass, ahk_id %hWnd%
    If (winClass != "Shell_TrayWnd")
        prID := -1
    Else If ((ID := AccIDUnderMouse()) && ID != prID && (prID := ID))
    { 
        WinActivate % "ahk_id" hShellTray
        SendInput ^{LButton}{LControl Up}
    }  
    SetTimer, MouseGet, -10
    Return
    
AccIDUnderMouse()   { 
    If DllCall("oleacc\AccessibleObjectFromPoint"
        , "Int64", 0*DllCall("GetCursorPos","Int64*",pt)+pt, "Ptr*", pacc
        , "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild) = 0 
    Return NumGet(varChild,8,"UInt") 
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK:Активация окна при наведении курсора на ярлык. Несколько мониторов

teadrinker, не срабатывает скрипт.
На панели задач главного монитора - работает нормально.
Но если наводить курсор на ярлыки - на других панелей задач - то скрипт не щелкает по ним.

Насчет ahk панелей задач:
На главной панели задач - название ahk_class Shel_TrayWnd
На второстепенных панелях задач - название ahk_class UltraMonDeskTaskBar

8 (изменено: teadrinker, 2018-11-13 19:33:45)

Re: AHK:Активация окна при наведении курсора на ярлык. Несколько мониторов

Попробуйте на второстепенных мониторах навести курсор на панель задач, сначала на середину, потом на область иконок (трей).
Какой ClassNN выдаёт ActiveWindow Info в этих двух случаях?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9 (изменено: OlegSmirnov, 2018-11-13 19:53:10)

Re: AHK:Активация окна при наведении курсора на ярлык. Несколько мониторов

teadrinker на второстепенных мониторах - везде "ClassNN:ToolbarWindow321"
На основном мониторе - везде "ClassNN:MSTaskListWClass1"
(На панели задач второстепенных мониторов - трей отсутствует)

10 (изменено: teadrinker, 2018-11-13 21:19:31)

Re: AHK:Активация окна при наведении курсора на ярлык. Несколько мониторов

OlegSmirnov пишет:

На главной панели задач - название ahk_class Shel_TrayWnd

Уверены, что именно так, не Shell_TrayWnd (с двойной l)?
Остальные названия точно без ошибок написаны?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK:Активация окна при наведении курсора на ярлык. Несколько мониторов

teadrinker да действительно - с двумя l - Shell_TrayWnd
Остальные названия - без ошибок.
Только что перепроверил.

12 (изменено: teadrinker, 2018-11-14 01:14:46)

Re: AHK:Активация окна при наведении курсора на ярлык. Несколько мониторов

Тогда так попробуйте:

#Persistent
prID := -1 
DllCall("LoadLibrary","Str","oleacc","Ptr") 

MouseGet:
   MouseGetPos,,, hWnd, classNN
   WinGetClass, winClass, ahk_id %hWnd%
   Loop 1  {
      _prID := prID, prID := -1
      if winClass not in Shell_TrayWnd,UltraMonDeskTaskBar
         break
      if (winClass = "Shell_TrayWnd" && classNN != "MSTaskListWClass1") || (winClass = "UltraMonDeskTaskBar" && classNN != "ToolbarWindow321")
         break
      
      prID := _prID
      if ((ID := AccIDUnderMouse()) && ID != prID && (prID := ID))
         Send {LButton}
   }  
   SetTimer, MouseGet, -100
   Return

AccIDUnderMouse()   { 
   If DllCall("oleacc\AccessibleObjectFromPoint"
      , "Int64", 0*DllCall("GetCursorPos","Int64*",pt)+pt, "Ptr*", pacc
      , "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild) = 0 
   Return NumGet(varChild,8,"UInt") 
}

Я не совсем понял, зачем в изначальном скрипте для активации стоит

        WinActivate % "ahk_id" hShellTray
        SendInput ^{LButton}{LControl Up}

Вроде, простого клика достаточно. Но если что-то будет не так, попробуйте заменить Send {LButton} на Send ^{LButton}.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK:Активация окна при наведении курсора на ярлык. Несколько мониторов

teadrinker а вот сейчас - все нормально вроде работает.
Спасибо вам большое.