1

Тема: AHK: Задание работы скрипта во встраиваемом окне программы

Использую ряд пользовательских горячих клавиш при монтаже в Vegas Pro. В виду обычных ограничений в настройках горячих клавиш внутри самой программы, во многом использую возможности AHK. Т.е. храню настройки там и тут. Недавно решил переписать все клавишные сокращения посредством AHK, оставив настройки внутри самой программы по умолчанию. Но не учел того факта, что клавиши могут срабатывать и в том случае, когда я просто набираю текст внутри программы, например, задаю название извлеченному маркеру или же используя быстрый поиск. Не знаю, как это можно было бы обойти, кроме задания работы определенных горячих клавиш только в области таймлайна. Если это единственный вариант выхода из ситуации, пожалуйста, помогите задать данное условие, т.к. самостоятельные попытки к успеху не привели.

http://puu.sh/l2Ym5/1481f31463.jpg

Пример пары клавиш:

~vkC0 Up::Send {vkC0}

vkC0 & vk44:: SendInput ^{vk58} ; клавиша для работы на timeline; Cut (` + D)
vkC0 & f5:: SendInput ^{vk5A} ; глобальная клавиша; Undo (` + F5)

2

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Пробовал задавать условие #IfWinActive?
Насколько помню у "подокон" имена есть... (через 3 часа смогу убедиться в этом сам)

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

3

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Alectric, да, скорее всего, неправильно использовал данные из Spy Window.
Так, значит, задание условия относительно работы скрипта в "подокне" программы единственное возможное решение?

4 (изменено: Alectric, 2015-10-30 16:44:21)

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Вот так с помощью АСС через координаты:

#include,%a_scriptdir%\Acc.ahk
#SingleInstance,Force


#if Inwin("Tracks")
f3::
tooltip,% a_tickcount "`n Tracks"
return
#if Inwin("Master Bus")
f3::
tooltip,Master Bus
return
#if

Inwin(win)
{
  hwnd:=winexist("ahk_exe vegas120.exe") ; не забудь поменять на свой exe
  Acc:=Acc_ObjectFromWindow(hwnd)
  mousegetpos,x,y,mhwnd
  AccAdd:=GetElementByName(Acc,win)
  P:=Acc_Location(AccAdd)
;tooltip,% x "`t" y "`nx=" p.x "`ty=" p.y "`tw=" p.w "`th=" p.h
  if (hwnd=mhwnd) and (x>p.x and x<p.x+p.w and y>p.y and y<p.y+p.h)
    return 1
}

GetElementByName(AccObj, name) {
   if (AccObj.accName(0) = name)
      return AccObj

   for k, v in Acc_Children(AccObj)
      if IsObject(obj := GetElementByName(v, name))
         return obj
}

Нужна библиотека Асс.ahk.


...


Или я не так тебя понял:

#Ifwinactive,ahk_class Vegas.Class.Frame
f3::
tooltip,% a_tickcount
return

Я сначала понял, что нужно: если курсор находится над таймлайном, то клавиши должны работать, а над другими панелями - не должны.

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

5

Re: AHK: Задание работы скрипта во встраиваемом окне программы

При нажатии по F3 в области таймлайна выходит следующее сообщение:

http://puu.sh/l3feO/89fee4a061.png

6

Re: AHK: Задание работы скрипта во встраиваемом окне программы

  hwnd:=winexist("ahk_exe vegas120.exe") ; не забудь поменять на свой exe

Тут поменял?

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

7

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Alectric, да

8

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Весь код можно посмотреть?

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

9

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Alectric, я только заменил имя исполняемого файла

#include,%a_scriptdir%\Acc.ahk
#SingleInstance,Force


#if Inwin("Tracks")
f3::
tooltip,% a_tickcount "`n Tracks"
return
#if Inwin("Master Bus")
f3::
tooltip,Master Bus
return
#if

Inwin(win)
{
  hwnd:=winexist("ahk_exe vegas130.exe") ; не забудь поменять на свой exe
  Acc:=Acc_ObjectFromWindow(hwnd)
  mousegetpos,x,y,mhwnd
  AccAdd:=GetElementByName(Acc,win)
  P:=Acc_Location(AccAdd)
;tooltip,% x "`t" y "`nx=" p.x "`ty=" p.y "`tw=" p.w "`th=" p.h
  if (hwnd=mhwnd) and (x>p.x and x<p.x+p.w and y>p.y and y<p.y+p.h)
    return 1
}

GetElementByName(AccObj, name) {
   if (AccObj.accName(0) = name)
      return AccObj

   for k, v in Acc_Children(AccObj)
      if IsObject(obj := GetElementByName(v, name))
         return obj
}

10 (изменено: Alectric, 2015-10-30 21:04:26)

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Даже не знаю в чем причина, первый раз вижу такую ошибку...
Попробуй сверху вставить:

ComObjError(false)

По идее не должна ошибка выходить, но и работать не должно...
Видимо пора отдохнуть...

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

11

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Alectric, работает. У Вас тоже действие срабатывает с большой задержкой?

12 (изменено: Alectric, 2015-10-30 21:20:56)

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Иногда с большой иногда нет, это минус использования Acc, но других способов я не вижу... пока-что. Т.к. контролы все время меняются и как отдельные окна эти "подокна" не определяются, пока их не отделишь...

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

13

Re: AHK: Задание работы скрипта во встраиваемом окне программы

В 28 строчку добавь в начало try. после этого должно игнорировать ошибку.

try if (AccObj.accName(0) = name)

14 (изменено: Alectric, 2015-10-30 21:28:49)

Re: AHK: Задание работы скрипта во встраиваемом окне программы

yalanne пишет:

try

Пока еще не разбирался с "попыткой", но кажется там "ловить" (catch) нужно обязательно или нет? Да и не понял пока - как это действует "внутри" (всмысле - делает эту ошибку не критической для системы или просто ловит сообщение об ошибке и не выводит на экран, в плане безопасности таких ошибок...).

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

15

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Иногда с большой иногда нет, это минус использования Acc, но других способов я не вижу... пока-что. Т.к. контролы все время меняются и как отдельные окна эти "подокна" не определяются, пока их не отделишь...

У меня в 13 вегасе контрол таймлайна - vegas.class.doc10.

16

Re: AHK: Задание работы скрипта во встраиваемом окне программы

В общем, вариант от Alectric работает, но в качестве сокращений его использовать вряд ли получится. Скорость отзывчивости слишком мала.
Уважаемый Malcev однажды подсказал о таком методе работы с таймлайном в Premiere Pro:

#if timeline()
WheelUp:: Send {=}
WheelDown:: Send {-}
#if

timeline()
{
   IfWinActive ahk_class Premiere Pro
   {
      MouseGetPos, , , id, control    ; узнаем над каким контролом находится мышка
      n := RegExReplace(control, "\D")   ;  присваиваем переменной номер контрола
      If (n>=19) and (n<=50)   ; n находим опытным путем
         return !ErrorLevel
   }
}

Возможно, есть вероятность интерпретации данного метода?

17

Re: AHK: Задание работы скрипта во встраиваемом окне программы

#if timeline()
1:: msgbox timeline
#if

timeline()
{
   IfWinActive ahk_class Vegas.Class.Frame
   {
      ControlGetFocus, control, ahk_class Vegas.Class.Frame
      If (control="Vegas.Class.Doc10")
         return !ErrorLevel
   }
}

18 (изменено: Alectric, 2015-10-30 22:23:58)

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Malcev пишет:

У меня в 13 вегасе контрол таймлайна - vegas.class.doc10.

Если переместить или добавить "под-окно", то число в конце меняется. У меня к примеру doc5 - doc4 (если закрыть 1 "под-окно").

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

19

Re: AHK: Задание работы скрипта во встраиваемом окне программы

#if timeline()
1:: msgbox timeline
#if

timeline()
{
   IfWinActive ahk_class Vegas.Class.Frame
   {
      ControlGetFocus, control, ahk_class Vegas.Class.Frame
      If Instr(control, "Vegas.Class.Doc")
         return !ErrorLevel
   }
}

20 (изменено: becauseim, 2015-10-31 21:35:26)

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Не получается объединить два скрипта в одном файле. А именно, не работает первый сценарий, который должен работать в окне программы целиком. Как правильно их объединить?



ArrVegas:=	{"F2":{"Label":"F2", "Delay":250}}
		
Hotkey, IfWinActive, Vegas Pro 13.0
		
For key in ArrVegas  {
	Hotkey, %key%, Work
	ArrVegas[key]["C"] := 0
}
Return

Work:
	o := ArrVegas[A_ThisHotkey], o["C"] := A_TickCount - o["T"] < o["Delay"] ? o["C"] + 1 : 1 
	o["T"] := A_TickCount, IsLabel(o["Label"] "_" o["C"]) ? 0 : (o["C"] := 1) 
	Try Gosub, % o["Label"] "_" o["C"]
	Return

F2_1:
	SendInput ^!+k
	Return
			
F2_2:
	SendInput !0+^[
	Return
#if timeline()
vk44:: SendInput {Delete}
#if

timeline()
{
   IfWinActive ahk_class Vegas.Class.Frame
   {
      ControlGetFocus, control, ahk_class Vegas.Class.Frame
      If Instr(control, "Vegas.Class.Doc")
         return !ErrorLevel
   }
}

21 (изменено: Alectric, 2015-10-31 21:44:15)

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Hotkey, IfWinActive, Vegas Pro 13.0

Название окна разве не меняется при открытии проекта?

Hotkey,IfWinActive,ahk_class Vegas.Class.Frame

...

На мой взгляд код:

#if timeline()
vk44:: tooltip,Delete
#if

timeline()
{
   IfWinActive ahk_class Vegas.Class.Frame
   {
      ControlGetFocus, control, ahk_class Vegas.Class.Frame
      If Instr(control, "Vegas.Class.Doc")
         return !ErrorLevel
   }
}

равносилен:

#IfWinActive ahk_class Vegas.Class.Frame
vk44:: tooltip,Delete
#if

,т.к. клавиша срабатывает по всей площади окна.

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

22 (изменено: becauseim, 2015-10-31 21:49:01)

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Alectric, не совсем Вас понял. Первый скрипт должен работать в в окне программы. Второй же работает только в области таймлана, чего удалось добиться благодаря методу от Malcev. Оба сценария работают необходимым образом, но только из разных файлов. Располагаясь в одном файле, горячая клавиша из первого сценария уже не активна.

upd.: Не равносилен, т.к. срабатывает всюду, а не в заданной области.

23

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Видимо в 12ой версии по другому...

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

24

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Alectric, не подскажете, как все-таки объединить сценарии в один файл? Чтобы горячая клавиша F2 также была активной.

25 (изменено: Alectric, 2015-10-31 22:07:17)

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Уже ж написал выше.

Hotkey,IfWinActive,ahk_class Vegas.Class.Frame

Или в 13ой версии окно не меняет названия, при открытии проекта?

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

26

Re: AHK: Задание работы скрипта во встраиваемом окне программы

Не знаю, правильно ли я сделал, но не работает.

+ открыть спойлер
#SingleInstance Force

ArrVegas:=	{"F2":{"Label":"F2", "Delay":250}}
		
Hotkey, IfWinActive, ahk_class Vegas.Class.Frame
		
For key in ArrVegas  {
	Hotkey, %key%, Work
	ArrVegas[key]["C"] := 0
}
Return

Work:
	o := ArrVegas[A_ThisHotkey], o["C"] := A_TickCount - o["T"] < o["Delay"] ? o["C"] + 1 : 1 
	o["T"] := A_TickCount, IsLabel(o["Label"] "_" o["C"]) ? 0 : (o["C"] := 1) 
	Try Gosub, % o["Label"] "_" o["C"]
	Return

F2_1:
	SendInput ^!+k
	Return
			
F2_2:
	SendInput !0+^[
	Return
	
	


#if timeline()
vk44:: SendInput {Delete}
#if

timeline()
{
   IfWinActive ahk_class Vegas.Class.Frame
   {
      ControlGetFocus, control, ahk_class Vegas.Class.Frame
      If Instr(control, "Vegas.Class.Doc")
         return !ErrorLevel
   }
}

27

Re: AHK: Задание работы скрипта во встраиваемом окне программы

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

timeline()
{
	Global
	IfWinActive ahk_class Premiere Pro
	{
		MouseGetPos,,,, Ctrl, 2
		ControlGetPos, xCtrl, yCtrl,,,, ahk_id %ctrl%
		if ((yCtrl != 80) and (StateEditing = 520))
			{
				return !ErrorLevel
			}
	}
}

#UseHook
Array := ["^+{f2}", "^+{f7}", "^+{f5}", "^+{f6}", "^+{f1}"], max := Array.MaxIndex()
Return

#If processing
*sc32:: Return
#If

#if timeline()
sc32::   ; m
   KeyWait, % A_ThisHotkey, T0.3
   if !ErrorLevel
      SendInput, {%A_ThisHotkey%}
   else  {
      while GetKeyState(A_ThisHotkey, "P") && processing := 1  {
         SendInput, % Array[(k := mod(A_Index, max)) ? k : max]
         Sleep, 500
      }
      processing := ""
   }
   Return

g:: ToolTip g

28

Re: AHK: Задание работы скрипта во встраиваемом окне программы

becauseim пишет:

правильно ли я сделал

Функция timeline() выглядит странно. Почему yCtrl не должно быть равно именно 80? А переменная StateEditing вообще не задана. Как она может быть равна 520?

Чтобы подсказать, как правильно, нужно Premiere Pro иметь.

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