2016-01-19 2 views
0

Я пишу скрипт в autohotkey. Цель скрипта - изменить действие, выполняемое программой, которую кто-то нажимает на панель задач. Например, если кто-то говорит о тройных кликах IE на панели задач, он открывается в приватном режиме. У меня есть код ниже, моя проблема заключается в том, что я пытаюсь найти способ автоматического определения местоположения значков панели задач на панели задач, чтобы программа могла установить ее границы для каждого щелчка. Я пробовал искать в реестре, и я также попытался извлечь иконки из программ и искать их на экране с помощью imagesearch, но он не может найти иконки .... В любом случае я могу это сделать?Найти Cordinates из закрепленной панели задач Shorcuts?

КОД

#NoEnv ; Recommended for performance and compatibility with future 
AutoHotkey releases. 
; #Warn ; Enable warnings to assist with detecting common errors. 
SendMode Input ; Recommended for new scripts due to its superior speed and reliability. 
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. 

#SingleInstance Force 
CoordMode, Mouse, Screen 
Time = 500 
~Lbutton:: 
;if there is a double left click 
If (A_PriorHotKey = A_ThisHotKey and A_TimeSincePriorHotkey < Time) 

    { 
    Count ++ 
    } 
Else 
{ 
Count = 1 
} 
SetTimer, Handler, %Time% 
return 
Handler: 
SetTimer, Handler, Off 
IfEqual, Count, 2 
    { 
     If (Mouse_y > 1040) 
      { 
       If (Mouse_x > 50) and (Mouse_x < 98) ;over my explorer icon 
       { 
        Run, "%A_AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\Internet Explorer.lnk" 
       } 


       If (Mouse_x > 99) and (Mouse_x < 147) ; over powershell ise 
       { 
         Run, explorer.exe 
       } 


       If (Mouse_x > 148) and (Mouse_x < 196) ; over chrome 
       {  
       Run, "%A_AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\outlook 2013.lnk" 
       } 


       If (Mouse_x > 197) and (Mouse_x < 245) ; over ie 
       { 
       Run, "%A_AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\Active Directory Users and Computers.lnk" 
       } 


       If (Mouse_x > 246) and (Mouse_x < 294) ; over vs 2015 
       { 
       Run, "%A_AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\DHCP.lnk" 
       } 


       If (Mouse_x > 295) and (Mouse_x < 343) ; over pusbullet 
       { 
       Run, "%A_AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\DNS.lnk" 
       } 
      } 
    } 
IfEqual, Count, 3 
    { 
     If (Mouse_y > 1040) 
      { 
       If (Mouse_x > 50) and (Mouse_x < 98) ;over my explorer icon 
       { 
        Run, "%A_AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\Internet Explorer.lnk" -private 
       } 


       If (Mouse_x > 99) and (Mouse_x < 147) ; over powershell ise 
       { 
         Run, explorer.exe 
       } 


       If (Mouse_x > 148) and (Mouse_x < 196) ; over chrome 
       {  
       Run, "%A_AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\outlook 2013.lnk" 
       } 


       If (Mouse_x > 197) and (Mouse_x < 245) ; over ie 
       { 
       Run, "%A_AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\Active Directory Users and Computers.lnk" 
       } 


       If (Mouse_x > 246) and (Mouse_x < 294) ; over vs 2015 
       { 
       Run, "%A_AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\DHCP.lnk" 
       } 


       If (Mouse_x > 295) and (Mouse_x < 343) ; over pusbullet 
       { 
       Run, "%A_AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\DNS.lnk" 
       } 
    } 

} 
+0

см Http: //stackoverflow.com/questions/31375455/detect-which-taskbar-button-was-clicked-identify-target-window – Blauhirn

ответ

1

Я пробовал подобные вещи раньше, и позвольте мне сказать вам, расположение значков не в реестре. Я зарегистрировал каждый доступ к файлу/реестру, который произошел при нажатии или перемещении значка на панели задач. Поэтому я могу только предположить, что эта информация хранится в процессе проводника. Вы можете более или менее доказать, что перемещая значки на панели задач и перезапуская процесс проводника. Затем будут сохранены позиции значков на панели задач.

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

Правильно настроенный поиск изображений должен работать.

  • найти все окна
  • найти процесс, который проходит каждое окно и извлечь иконку из его еха
    (или даже лучше найти способ извлечь значок формирует окно непосредственно.)
  • узнать размер которых составляет значки на панели задач:
  • возможно изменить размер извлеченных значков с помощью gdip
  • затем создать специальную кнопку быстрого доступа на панели задач, которая выполняет поиск изображений на небольшом радиусе вокруг мыши на панели задач.

Но это займет много исследований и работы ..

Чистейший вещь, вероятно, будет использовать крюк оболочки. Но сценарии ahk, которые используют оболочки-крючки, очень редки, поэтому это означало бы еще больше исследований.

Редактировать:
Я только понял, что вы говорите о закрепленных значках в частности.
Для этого вы могли бы цикл через каталог, который содержит все возлагали ярлыки ...
Просто чтобы дать вам некоторое представление:
(полностью непроверенной и imagesearch, скорее всего, нуждается в регулировке)

CoordMode, Mouse, Screen 
~LButton:: 
    If (A_TimeSincePriorHotkey<400) and (A_PriorHotkey="~LButton") { 
     WinGetPos, taskBarX, taskBarY, taskBarW, taskBarH, ahk_class Shell_TrayWnd 
     MouseGetPos, mouseX, mouseY 
     If (mouseX >= taskBarX && mouseY >= taskBarY && mouseX <= taskBarX+taskBarW && mouseY <= taskBarY+taskBarH) 
      OnDoubleClickTaskbar(mouseX, mouseY, taskBarX, taskBarY, taskBarW, taskBarH) 
    } 
Return 

OnDoubleClickTaskbar(mX,mY,tX,tY,tH,tW) { 
    iconSize := GetTaskbarIconSize() 
    pinnedIcons := GetPinnedIcons() 
    Loop % pinnedIcons.MaxIndex() { 
     ico := pinnedIcons[A_Index] 
     ImageSearch, foundX, foundY, tX, tY, tW, tH, % "*Icon" ico.index " " "*20" " " "*w" iconSize " " "*h" iconSize " " ico.icon 
     If (!ErrorLevel) 
      MsgBox, % "Icon found: " ico.icon "," ico.index " at " "x" foundX " y" foundY 
     Else 
      MsgBox, % "Icon not found: " ico.icon "," ico.index 
    } 
} 

GetPinnedIcons() { 
    pinnedIcons := [] 
    Loop, % A_AppData "\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\*.lnk" 
    { 
     FileGetShortcut, % A_LoopFileFullPath, shortCutTarget,,,, icon, iconIndex 
     pinnedIcons[A_Index] := {"icon":icon, "index": iconIndex} 
    } 
    Return pinnedIcons 
} 

GetTaskbarIconSize() { 
    Return 32 
} 
+0

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

+0

Попробуйте запустить его с правами администратора. – Forivin

+0

Нет, это не исправить:/ – Darin

Смежные вопросы