1 (изменено: ОсиповаТатьяна, 2018-12-26 23:27:15)

Тема: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

Здравствуйте уважаемые программисты Autohotkey.

У меня есть текстовый файл 1.txt
На компьютере открыто окно с названием "Total Commander"
И еще одно окно в названии которого есть слово "Блокнот"

В 1.txt сделаны записи в две строки:
Total Commander -
Блокнот -

Скажите как скриптом засекать нажатия клавиш клавиш клавиатуры или кликов мышки - в отдельном окне и добавлять число нажатий в 1.txt ?

То есть если выделено окно Total Commander и нажата любая клавиша, а затем выделено окно Блокнота и сделано три клика мышкой внутри него - то запись будет такой:
Total Commander -1
Блокнот -3

Post's attachments

1.txt 30 b, 3 downloads since 2018-12-26 

You don't have the permssions to download the attachments of this post.

2

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

~LButton::
WinGetClass, OutputVar, A
IF OutputVar = Notepad
{
 Tooltip, ЭТО БЛОКНОТ
NNN++
Sleep, 200
MsgBox, Счётчик для Блокнота: %NNN%
}
Return

3

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

ypppu, а как эти сообщения не в окнах выводить, а записывать этот текст в закрытый файл 1.txt ?

4

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

ОсиповаТатьяна, используй ini файлы.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

5

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

Phoenixxx_Czar, а как это сделать ?
Я только начала осваивать этот язык программирования.

6

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

ОсиповаТатьяна, IniRead и IniWrite, да гугл будет с вами.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

7

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

Phoenixxx_Czar а зачем нужен файл ini
Ведь нужно же в txt записать ?
То есть два файла должно быть - txt и ini ?

8

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

Fileappend - простая команда для записи в файл. Данные в переменную занесены, остаётся подставить переменную в команду fileappend.

9

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

Потому что в Ini файлы намного проще записывать данные, чем в txt. Просто погуглите функционал команды FileAppend (запись в текстовый файл) и IniWrite (запись в ini файл).

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

10 (изменено: Indomito, 2018-12-27 22:36:17)

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

belyankin12
По сути то одинаково, если не стоит вопрос - "Как с этим разобраться, что бы считать и вывести на экран?".

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

11

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

ОсиповаТатьяна

FileAppend
Добавляет текст к файлу (создавая файл при необходимости).
FileAppend [, Text, Filename]

FileAppend, что то записали.`n, C:\Мои документы\Test.txt ; Где `n эквивалент Enter

Или так.

a := "что то записали.`n" 
FileAppend, %a%, C:\Мои документы\Test.txt ; Где `n эквивалент Enter

Удачи с АНК!

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

12 (изменено: ОсиповаТатьяна, 2018-12-28 00:08:13)

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

Indomito
Теперь код  выглядит вот так:

~LButton::
WinGetClass, OutputVar, A
IF OutputVar = Notepad
{
 Tooltip, ЭТО БЛОКНОТ
NNN++
Sleep, 200
MsgBox, Счётчик для Блокнота: %NNN%

 
FileAppend, %NNN%, M:\1537\1.txt ; Где `n эквивалент Enter

}
Return

Но скрипт выводит результат не совсем как счетчик.
Он пишет числа, одно за другим вдоль строки. А если повторно его запустить - то продолжает писать вдоль строки по-новой, начиная с единицы.  Примерно вот так:
"Блокнот -123412345"

Я имела ввиду запись счетчика в смысле - прирост числа на единицу.

То есть например записано "Блокнот -1",  а после одного срабатывания должно получится "Блокнот -2", то есть прирост числа на одну единицу.

13 (изменено: Phoenixxx_Czar, 2018-12-28 04:03:57)

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

ОсиповаТатьяна, ну значит смотри.

global DIR_INI := "m:/1537/1.ini"

IniRead, countNotepad, % DIR_INI, Global, Notepad
IniRead, countTotalCommander, % DIR_INI, Global, Total_Commander

for k, v in ["countNotepad", "countTotalCommander"]
	if (%v% == "ERROR")
		%v% := 0

~LButton::
WinGetClass, OutputVar, A
IF (OutputVar == "Notepad")
{
	countNotepad++
	IniWrite, % countNotepad, % DIR_INI, Global, Notepad
	Tooltip, ЭТО БЛОКНОТ
	Sleep, 200
	MsgBox, % "Счётчик для Блокнота: " countNotepad
}
Return

Опять же! Проще все это делать через массив и сохранять в JSON формате. Меньше мороки с считыванием каждого значения с INI файла и записыванием в него.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

14

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

Для того, кто только погружается в AHK, то, что Вы предлагаете последним, не объясняет необходимость использования. К тому же, возможно, хранить в текстовом файле - принципиально, чтобы использовать где-то ещё, а так же, может не быть обязательным, постоянно писать изменения счётчика. Можно это делать при переключении на любое другое окно.


temp := counter := 0

~LButton::
WinGetClass, OutputVar, A
if OutputVar = Notepad
{
	counter++
} else if (temp != counter) {
	temp := counter
	WriteData("Блокнот -" . counter))
}
Return

WriteData(data, storage := "M:\1537\1.txt") {
	file := FileOpen(storage, "w", "utf-8")
	file.Write(data)
	file.Close()
}

И ещё момент, если Ваш посыл обращается к предыдущему оратору, не обязательно это обозначать выделяя жирным текстом его псевдоним. Это и так очевидно по смыслу сказанного.

15

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

Кстати, значения "по умолчанию" для IniRead, можно указать через запятую:


IniRead, countNotepad, % DIR_INI, Global, Notepad, 0
IniRead, countTotalCommander, % DIR_INI, Global, Total_Commander, 0

16

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

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

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

17

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

Phoenixxx_Czar
Этот код считает только клики мышкой.
А как заставить код реагировать - еще и на нажатия клавиш ?

18

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

KusochekDobra пишет:

может не быть обязательным, постоянно писать изменения счётчика. Можно это делать при переключении на любое другое окно

Не совсем корректно. Если скрипт будет завершён до переключения на другое окно, текст не запишется.

ОсиповаТатьяна пишет:

А как заставить код реагировать - еще и на нажатия клавиш ?

Можно назначить все кнопки клавиатуры и мыши горячими клавишами таким образом:

Loop 255
   Hotkey, % "~vk" . Format("{:X}", A_Index), WatchPress, On
Return

WatchPress()  {
   static obj := { TTOTAL_CMD: {text: "Total Commander", count: 0}, Notepad: {text: "Блокнот", count: 0} }
   Critical
   WinGetClass, winClass, A
   if winClass not in TTOTAL_CMD,Notepad
      Return
   
   obj[winClass, "count"]++
   for k, v in obj
      text .= (text = "" ? "" : "`r`n") . v.text . " -" . v.count
   Sort, text
   
   oFile := FileOpen(A_ScriptDir . "\1.txt", "w")
   oFile.Write(text)
   oFile.Close()
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

19

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

А не подскажите, возможно ли провернуть похожее со строками автозамены? У меня есть длиннющий список таких строк, который периодически пополняется новыми, но заменяемые строки в основном состоят из одинаковых составных частей, различаясь лишь в частностях, таким образом, было бы удобно иметь составные наборы, из которых эти "HotStrings" динамически собирались, как в Вашем примере с хоткеями. Что-то вроде:


vars := ["test", "тест"]
str  := ["tt", "тт"]
Loop 2 {
	i := A_Index
	Loop 10 {
		t := vars[ i ] . " " . A_Index
		Hotstring(Format(":*:{}{}::", str[i], A_Index), Ctrl_V("%t%") )
	}
}
Ctrl_V(param) {
	Send { ^a }
	SendInput {Text}%param%
}

Не соображу всё, как бы правильно сделать запись.

20

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

Не совсем понял идею, что должно в итоге получаться. Лучше новую тему создайте, чтобы здесь людей не путать.

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

21

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

teadrinker, спасибо вам.
Теперь все заработало.

22

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

teadrinker пишет:
   oFile := FileOpen(A_ScriptDir . "\1.txt", "w")
   oFile.Write(text)
   oFile.Close()

А почему не «FileAppend»?

23

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

FileAppend дописывает, если файл уже существует, Write переписывает всё заново.

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

24

Re: AHK: Запись в txt суммы нажатий клавиш или кликов - в конкретном окне

Здесь хорошо написано про FileAppend: https://www.autohotkey.com/boards/viewt … save+files.

+ DD