1

Тема: AHK: периодическ проверка цифрового значения в файле и запуск shortkey

Доброго времени суток. Возникла необходимость автоматизировать следующую задачу:
1. Имеется файл 1.txt куда периодически записывается всегда одно число - оно меняется. При достижении, например, 10, необходимо выполнить горячее сочетание клавиш, условно Ctr-Alt-F. Спустя 10 секунд повторить выполнение этого же сочетания Ctr-Alt-F.
2. Выполнять эту задачу (п.1) опять, но уже для числа 20 в этом же файле.
3. Выполнять эту задачу (п.1) опять, но уже для числа 30 в этом же файле.
Как проще всего это реализовать? Спасибо!

2

Re: AHK: периодическ проверка цифрового значения в файле и запуск shortkey

Думаю план такой:
Использовать цикл - открыл файл, прочитал содержимое в переменную, закрыл его.
Определил какую цифру содержит эта переменянная - выполнил действие, прибавил к некой переменной, например Index +10.
Подождал Index секунд. Если выше 30 - обнулил.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

3 (изменено: alexiii, 2020-12-03 18:15:57)

Re: AHK: периодическ проверка цифрового значения в файле и запуск shortkey

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

Loop  {
   FileRead, LCount, e:\Work\\files\Counters\Count.txt
   Sleep, 6000 
   }
   until LCount = 10
	Send ^!{vk47}
	Sleep, 10000
	Send ^!{vk47}

Loop  {
   FileRead, LCount, e:\Work\files\Counters\Count.txt
   Sleep, 6000 
   }
   until LCount = 20
	Send ^!{vk46}
	Sleep, 10000
	Send ^!{vk46}
   
Loop  {
   FileRead, LCount, e:\Work\files\Counters\Count.txt
   Sleep, 6000 
   }
   until LCount = 30
	Send ^!{vk54}
	Sleep, 20000
	Send ^!{vk54}

Пробовал использовать ControlSend вместо Send, но тоже не реагирует программа (OBS). Помогите разобраться, пожалуйста!

F6::ControlSend,, ^!{vk54}, ahk_class Qt5QWindowIcon 

ahk_class для OBS смотрел с помощью WinSpy.
Спасибо.

4

Re: AHK: периодическ проверка цифрового значения в файле и запуск shortkey

OFF: Заметил, что ник alexi ещё не занят. Странно.

5

Re: AHK: периодическ проверка цифрового значения в файле и запуск shortkey

ypppu
OFF: А должен был?

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

6

Re: AHK: периодическ проверка цифрового значения в файле и запуск shortkey

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


;Previously
global OBSHWND := GetOBS()

GetOBS() {
	ntmm := A_TitleMatchMode
	SetTitleMatchMode, Regex
	;use the main window title to get the ID of the main window, because that's were we want the hotkeys to go
	OBSHWND := WinExist("OBS .*[0-9]{2}\.[0-9]+\.[0-9]+ ahk_exe obs64.exe")
	SetTitleMatchMode, %ntmm% ;avoids complicating other title matches
	Return OBSHWND
}


SendKeyOBS(Key) {
	tDelay := 250 ;ms
	If OBSHWND { 
		If (WinExist("ahk_id " .  OBSHWND)) { ;set's last found window 
			SetKeyDelay, 50,80 ;I experimented with various values here
			;send key to last found window
			ControlSend,ahk_parent,%key%
			ErrLvl := ErrorLevel
			If ErrLvl
				;if you aren't using dbgview for script debugging consider it -- it is extremely useful (and free)
				OutputDebug % Format("[{}][{}] ErrLvl: {}",sScript,A_ThisFunc . "." . A_LineNumber, ErrLvl) . " "
			Sleep %tDelay% ;can't remember why this is here
		}
		OutputDebug % Format("[{}][{}] Key: {}; Err: {}; OBSHWND: {}",sScript,A_ThisFunc . "." . A_LineNumber,Key,ErrLvl,OBSHWND) . " "
	}
	Return ;no value returned
}

7

Re: AHK: периодическ проверка цифрового значения в файле и запуск shortkey

Написал скрипт, который почти устраивает по функционалу, но он работает только при активном окне программы

Вместо Send можно использовать ControlSend. Это более сложная команда, но по ней есть документация и куча примеров на нашем форуме.

8

Re: AHK: периодическ проверка цифрового значения в файле и запуск shortkey

ypppu Да, я пробовал (писал об этом выше). Не работает именно с OBS, на зарубежных форумах смотрел варианты обхода, вот и написал один их пользователей OBS как работает у него, но пока не могу осмыслить всю конструкцию. Где тут клавишу назначить и для чего другие команды в коде выше?

9

Re: AHK: периодическ проверка цифрового значения в файле и запуск shortkey

Что такое OBS?

10 (изменено: alexiii, 2020-12-02 22:09:01)

Re: AHK: периодическ проверка цифрового значения в файле и запуск shortkey

ypppu программа для записи видео и стриминга. https://ru.wikipedia.org/wiki/Open_Broadcaster_Software

11

Re: AHK: периодическ проверка цифрового значения в файле и запуск shortkey

alexiii

OBS не установлен, поэтому проверить свои догадки не могу. Скорее всего нужно отправлять в функцию 'SendKeyOBS' некую клавишу (в кавычках). Но какую - без понятия.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

12

Re: AHK: периодическ проверка цифрового значения в файле и запуск shortkey

Попробовал скачать программу, установил. С клвиатуры Alt-T работает, а из  AutoHotkey - нет. Хотя какие-то мелькания идут с таким кодом при неактивном окне:
ControlSend, , {LAlt Down}{T}{LAlt Up}, ahk_class Qt5QWindowIcon
А при активном даже работает. Что-то не хочет программа подчиняться AutoHotkey.

13

Re: AHK: периодическ проверка цифрового значения в файле и запуск shortkey

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

14

Re: AHK: периодическ проверка цифрового значения в файле и запуск shortkey

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

15 (изменено: alexiii, 2020-12-03 03:15:55)

Re: AHK: периодическ проверка цифрового значения в файле и запуск shortkey

ypppu пишет:

Попробовал скачать программу, установил. С клвиатуры Alt-T работает, а из  AutoHotkey - нет. Хотя какие-то мелькания идут с таким кодом при неактивном окне:
ControlSend, , {LAlt Down}{T}{LAlt Up}, ahk_class Qt5QWindowIcon
А при активном даже работает. Что-то не хочет программа подчиняться AutoHotkey.

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

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

;Previously
global OBSHWND := GetOBS()

GetOBS() {
	ntmm := A_TitleMatchMode
	SetTitleMatchMode, Regex
	;use the main window title to get the ID of the main window, because that's were we want the hotkeys to go
	OBSHWND := WinExist("OBS .*[0-9]{2}\.[0-9]+\.[0-9]+ ahk_exe obs64.exe")
	SetTitleMatchMode, %ntmm% ;avoids complicating other title matches
	Return OBSHWND
}


SendKeyOBS(Key) {
	tDelay := 250 ;ms
	If OBSHWND { 
		If (WinExist("ahk_id " .  OBSHWND)) { ;set's last found window 
			SetKeyDelay, 50,80 ;I experimented with various values here
			;send key to last found window
			ControlSend,ahk_parent,%key%
			ErrLvl := ErrorLevel
			If ErrLvl
				;if you aren't using dbgview for script debugging consider it -- it is extremely useful (and free)
				OutputDebug % Format("[{}][{}] ErrLvl: {}",sScript,A_ThisFunc . "." . A_LineNumber, ErrLvl) . " "
			Sleep %tDelay% ;can't remember why this is here
		}
		OutputDebug % Format("[{}][{}] Key: {}; Err: {}; OBSHWND: {}",sScript,A_ThisFunc . "." . A_LineNumber,Key,ErrLvl,OBSHWND) . " "
	}
	Return ;no value returned
}

16 (изменено: Malcev, 2020-12-03 04:50:42)

Re: AHK: периодическ проверка цифрового значения в файле и запуск shortkey

У меня всё проходит.

f6::
settitlematchmode 2
ControlSend, ahk_parent, {f12}, OBS ahk_exe obs64.exe

17 (изменено: alexiii, 2020-12-03 18:22:56)

Re: AHK: периодическ проверка цифрового значения в файле и запуск shortkey

Malcev пишет:

У меня всё проходит.

f6::
settitlematchmode 2
ControlSend, ahk_parent, {f12}, OBS ahk_exe obs64.exe

Да, если писать как вы предлагаете, то одиночное нажатие проходит (а комбинация нет). Спасибо! Пока переделал свой скрипт таким образом, перебиндил в игре занятые клавиши (((. Может его можно еще как-то грамотнее написать (оптимизировать)?

file = e:\Work\files\Counters\Count.txt
LCount =
If !FileExist(file) {
 MsgBox, 48, Error, Файл не найден. Отмена.`n`n%file%
 ExitApp
 }
FileReadLine, LCount, %file%, 1
Sleep, 500
If (LCount > 30) {
 MsgBox, 48, Error, Не запущена программа!`n`n%file%
 ExitApp
 }
  
settitlematchmode 2

Loop  {
   FileReadLine, LCount, %file%, 1
   Sleep, 6000 
   }
   until LCount = 10
    Sleep, 150
	ControlSend, ahk_parent, {f6}, OBS ahk_exe obs64.exe
	Sleep, 10000
	ControlSend, ahk_parent, {f6}, OBS ahk_exe obs64.exe

Loop  {
   FileReadLine, LCount, %file%, 1
   Sleep, 6000 
   }
   until LCount = 20
    Sleep, 150
    ControlSend, ahk_parent, {f7}, OBS ahk_exe obs64.exe
	Sleep, 12000
	ControlSend, ahk_parent, {f7}, OBS ahk_exe obs64.exe
   
Loop  {
   FileReadLine, LCount, %file%, 1
   Sleep, 6000 
   }
   until LCount = 30
    Sleep, 150
    ControlSend, ahk_parent, {f8}, OBS ahk_exe obs64.exe
	Sleep, 20000
	ControlSend, ahk_parent, {f8}, OBS ahk_exe obs64.exe
ExitApp

И почему-то сообщения в кириллице выводятся неверно...