1

Тема: AHK: Макрос подсчета разницы

Добрый день,

подскажите как сделать, чтобы при вводе $$число автоматически считалась и вводилась разница 10000 - число, где число < 10000.

2

Re: AHK: Макрос подсчета разницы

А сам числа в каком виде? В файле? Или надо каждое вводить?

3 (изменено: stuermer, 2021-11-02 20:30:48)

Re: AHK: Макрос подсчета разницы

Foma
каждый раз вводится вручную в notepad в виде $$число, например: ввожу $$5894, а макрос корректирует после пробела на 4103 (=10000 - 5894).

4

Re: AHK: Макрос подсчета разницы

Чтобы скопировать в буфер нужна Send с шифтом и "Home", потом обычный Ctrl+C. Чтобы убрать первые два символа смотрите в справке StringTrimLeft. Дальше математика, потом для записи смотрите команду Send.

5

Re: AHK: Макрос подсчета разницы

Foma
А математика как? Там же переменные надо определять.

6

Re: AHK: Макрос подсчета разницы

Hook := InputHook("V")
Hook.OnChar := Func("OnChar")
Hook.Start()

OnChar(Hook, char) {
   if RegExMatch(Hook.Input, "O)\$\$(\d+)\s", m)
      SendInput, % "{BS " . m.Len(1) + 3 . "}" . 10000 - m[1] . "{Space}"
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: __Михаил__, 2021-11-02 21:47:21)

Re: AHK: Макрос подсчета разницы

Лимит числа <1000 не учитывается в коде.
Ещё плюс вечный перехват клавиш.

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

8

Re: AHK: Макрос подсчета разницы

И что, у вас не работает?

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

9

Re: AHK: Макрос подсчета разницы

Код рабочий в целом, но в шапке условие:

stuermer пишет:

где число < 10000.

Например можно ввести 999999 и АХК выдаст ответ "-989999 ".

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

10

Re: AHK: Макрос подсчета разницы

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

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

11 (изменено: Foma, 2021-11-02 22:24:42)

Re: AHK: Макрос подсчета разницы

Ха, научили человека AHK, сначала выдали готовое, потом что-то вспомнили...

12

Re: AHK: Макрос подсчета разницы

На ошибках и примерах учатся. Разве не так? Некоторые варианты кода фиг где найдёшь если не показать.

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

13

Re: AHK: Макрос подсчета разницы

teadrinker пишет:

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

Да не нужна там проверка, я 10000 для примера написал. Спасибо.

14

Re: AHK: Макрос подсчета разницы

Что-то не работает этот код у меня.
У меня шапке стоят такие директивы:

#NoEnv ; For security
#SingleInstance force
#Persistent
SendMode Input

Еще сделал такое условие:

#IfWinActive name.txt Блокнот
...
return

Но и без условия не работает.

15 (изменено: Foma, 2021-11-02 23:27:28)

Re: AHK: Макрос подсчета разницы

На ошибках и примерах учатся. Разве не так? Некоторые варианты кода фиг где найдёшь если не показать.

  Я бы решал на другом уровне. И для новичка именно такой и нужен, как по мне. Выделить, скопировать, отрезать, вставить. Код из простых команд с подробным описанием. А вы показываете как  прибавить 3 к 5 с помощью рядов Тейлора и теории относительности. Я сколько лет пользуюсь на примитивном уровне  AHK и в дебри так и не влез. А вы новичка в такое

 (RegExMatch(Hook.Input, "O)\$\$(\d+)\s", m))

погружаете. Что он вынесет? Ощущение мистики и ноль на выходе.  КМК.

16

Re: AHK: Макрос подсчета разницы

Foma пишет:

Выделить, скопировать, отрезать, вставить

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

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

17

Re: AHK: Макрос подсчета разницы

Foma пишет:

погружаете. Что он вынесет? Ощущение мистики и ноль на выходе.  КМК.

Да согласен, в коде ничего не понял, кроме названий функций и изменить код сам не смогу ((.

18

Re: AHK: Макрос подсчета разницы

Вот и я об этом.

19

Re: AHK: Макрос подсчета разницы

Причем и префикс $$ уже не нужен, если всё только в Блокноте происходить будет.

20

Re: AHK: Макрос подсчета разницы

Foma
Я не показывал свой код, он у меня более громоздкий и написан уже тогда, когда не так важен.

Я сколько лет пользуюсь на примитивном уровне  AHK и в дебри так и не влез

Это уже ваши проблемы. Учится всё равно нужно.

Foma пишет:

Что он вынесет?

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

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

21

Re: AHK: Макрос подсчета разницы

stuermer пишет:

Да согласен, в коде ничего не понял, кроме названий функций и изменить код сам не смогу ((.

Так а в чём проблема почитать документацию? Если после прочтения остаются вопросы, можете задавать их здесь. Что касается RegEx — это действительно непростая штука, но другого способа понять эту тему, кроме постепенного изучения, не существует.

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

22

Re: AHK: Макрос подсчета разницы

А что с помощью StringTrimLeft никак нельзя отрезать два лишних символа спереди? И понятнее в разы будет. И подправить сможет когда понадобится.

23

Re: AHK: Макрос подсчета разницы

Foma, я не понял вашу идею, напишите код.

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

24

Re: AHK: Макрос подсчета разницы

stuermer пишет:

Да согласен, в коде ничего не понял, кроме названий функций и изменить код сам не смогу.

Может так будет чуть более понятней:


Loop {
	Input, Var, V, {Space}           ; Записываем нажатия пока не будет нажат пробел.
	if RegExMatch(Var, "\d+$", Var)  ; Если в конце записанной строки есть число, то
		Send % 10000 - Var           ; производим с ним вычисления и записываем результат после пробела.
}

25

Re: AHK: Макрос подсчета разницы

Ну, мне кажется, что описанная задача проще всего и нагляднее всего решается вот так:

^Numpad8::
ClipBoard := ""
Send, {Shift Down}{Home}{Shift Up}
Send, {Ctrl Down}{C}{Ctrl Up}
Send, {End}
var1 := ClipBoard
StringTrimLeft,var1,var1,2
Send,{Space}
Send, % 10000 - var1
Send,{Enter}
Return

26 (изменено: stuermer, 2021-11-03 15:42:35)

Re: AHK: Макрос подсчета разницы

Taveron пишет:

Loop {
	Input, Var, V, {Space}           ; Записываем нажатия пока не будет нажат пробел.
	if RegExMatch(Var, "\d+$", Var)  ; Если в конце записанной строки есть число, то
		Send % 10000 - Var           ; производим с ним вычисления и записываем результат после пробела.
}

Красиво, но тоже не работает чего-то.

27

Re: AHK: Макрос подсчета разницы

Foma пишет:

Ну, мне кажется, что описанная задача проще всего и нагляднее всего решается вот так:

Во-первых, у меня так не работает:

https://i.imgur.com/TtMGQRS.gif

Во-вторых, это немного другая задача, ваш скрипт не реагирует на ввод определённого паттерна, а пытается выполнять действия по горячей клавише. В-третьих, если мы выполняем действия по горячей клавише, какой смысл вводить $$ и потом их убирать с помощью StringTrimLeft (которая, кстати, deprecated) ?

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

28

Re: AHK: Макрос подсчета разницы

stuermer пишет:

красиво, но тоже не работает чего-то

Всё прекрасно работает, как и мой вариант. Вы запускаете код, как есть?

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

29

Re: AHK: Макрос подсчета разницы

teadrinker пишет:
stuermer пишет:

красиво, но тоже не работает чего-то

Всё прекрасно работает, как и мой вариант. Вы запускаете код, как есть?

Нет, у меня в одном файле куча разных макросов и в шапке:

#NoEnv ; For security
#SingleInstance force
#Persistent
SendMode Input

30

Re: AHK: Макрос подсчета разницы

Для начала проверьте, как есть.

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

31

Re: AHK: Макрос подсчета разницы

teadrinker пишет:

Для начала проверьте, как есть.

Заработало в отдельном файле, спасибо. Но пишет новое число рядом, а надо, чтобы вместо старого перезаписало.

32

Re: AHK: Макрос подсчета разницы

Теперь мой проверьте (там с $$).

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

33

Re: AHK: Макрос подсчета разницы

Только предыдущий пост не надо цитировать.

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

34 (изменено: stuermer, 2021-11-03 15:57:52)

Re: AHK: Макрос подсчета разницы

teadrinker
Тоже работает и перезаписывает, но оба варианта не реагируют на:

#IfWinActive name.txt Блокнот
...
return

и работают не только в блокноте.

35

Re: AHK: Макрос подсчета разницы

#IfWinActive — это директива только для горячих клавиш. В мой код можно добавить проверку, какое окно активно, и выполнять действия, только если активно подходящее.
Теперь покажите вариант кода, который у вас не работает.

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

36

Re: AHK: Макрос подсчета разницы

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

37

Re: AHK: Макрос подсчета разницы

Так у вас, я так понял, этот код же работает?

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

38

Re: AHK: Макрос подсчета разницы

teadrinker Еще не пробовал, я так понял его подправить надо.

39

Re: AHK: Макрос подсчета разницы

Я думал, раз плюсик поставили, работает. А что мешает попробовать?

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

40

Re: AHK: Макрос подсчета разницы

Плюсик за идею был. Переделал так (без префикса $$):

^Numpad8::
	ClipBoard := ""
	Send {Shift Down}{Home}{Shift Up}
	Send {Ctrl Down}{sc1E}{Ctrl Up}
	var1 := ClipBoard
	Send {Del}
	Send % 10000 - var1
return

но все равно не работает, только удаляет число. Подскажите, почему не посылает разницу?

41

Re: AHK: Макрос подсчета разницы

Вот эта конструкция

	Send {Shift Down}{Home}{Shift Up}
	Send {Ctrl Down}{sc1E}{Ctrl Up}

выглядит, во-первых, диковато, во-вторых, по Shift + Home будет выделяться вся строка с конца до начала. Это действительно то, что нужно?

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

42

Re: AHK: Макрос подсчета разницы

teadrinker да, выделяется всё число, потом копируется в буфер (если иначе нельзя его присвоить переменной), потом удаляется выделенное и потом хочу на его место вставить разницу.

43

Re: AHK: Макрос подсчета разницы

Это число обязательно будет написано в начале строки?

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

44

Re: AHK: Макрос подсчета разницы

Да, это отдельный файл только для этой цели. Там хранится это число.

45

Re: AHK: Макрос подсчета разницы

Если это число в файле, зачем его вообще открывать в блокноте, не проще прочитать прямо из файла?

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

46 (изменено: stuermer, 2021-11-03 20:44:20)

Re: AHK: Макрос подсчета разницы

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

47

Re: AHK: Макрос подсчета разницы

Ясно, сложная система. После отправки Ctrl + C текст в буфер обмена попадает не сразу, нужно использовать ClipWait, чтобы дождаться его.
Вот так должно работать на текущей версии AHK:

#If WinActive("ahk_class Notepad")
^Numpad8::
   ClipBoard := ""
   Send, +^{Left}
   Sleep, 50
   Send ^c
   ClipWait, 1
   SendInput, % 10000 - Clipboard
Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

48

Re: AHK: Макрос подсчета разницы

выглядит, во-первых, диковато, во-вторых, по Shift + Home будет выделяться вся строка с конца до начала. Это действительно то, что нужно?

Да, громоздко. Но прозрачно, что главное для таких как я и начинающих. Даже через год заглянешь в код и всё ясно.  Можно что-то добавить или изменить.
Я так и понял stuermer, что каждое число в отдельной строке. Странно это было бы видеть в непрерывной строке.

49

Re: AHK: Макрос подсчета разницы

Да, я теперь понял. Но в коде, который вы запостили, всё равно есть критичный недостаток — отсутствие ClipWait.

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

50

Re: AHK: Макрос подсчета разницы

Да работает, спасибо.

51

Re: AHK: Макрос подсчета разницы

Почему не был рассмотрен вариант с автозаменой? Можно было бы реагировать на ввод тех же $$ автоматически.

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

52

Re: AHK: Макрос подсчета разницы

Покажите код, рассмотрим!

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

53 (изменено: stuermer, 2021-11-03 21:43:01)

Re: AHK: Макрос подсчета разницы

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

#If WinActive("name.txt - Блокнот")
#If WinActive name.txt ahk_class Notepad

Что не так делаю?

54

Re: AHK: Макрос подсчета разницы

Значит название неправильно написали.

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

55

Re: AHK: Макрос подсчета разницы

stuermer пишет:
#If WinActive name.txt ahk_class Notepad

Так вообще нельзя, #If работает только с функцией WinActive(), а с командой WinActive нет.

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

56

Re: AHK: Макрос подсчета разницы

teadrinker

Post's attachments

notepad.png
notepad.png 5.88 kb, 1 downloads since 2021-11-03 

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

57 (изменено: stuermer, 2021-11-03 21:51:47)

Re: AHK: Макрос подсчета разницы

#If WinActive("name.txt - Блокнот")

Тоже не работает.

58

Re: AHK: Макрос подсчета разницы

Используйте AU3_Spy.exe (который идёт вместе с AHK) для получения точного названия окна. Вы ведь, скорее всего, просто вручную набрали.

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

59 (изменено: Taveron, 2021-11-03 23:04:09)

Re: AHK: Макрос подсчета разницы

stuermer, у вас заголовок меняется в зависимости от того, сохранён документ или нет. Используйте SetTitleMatchMode.


SetTitleMatchMode, 2
#IfWinActive, name.txt

60

Re: AHK: Макрос подсчета разницы

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

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

61 (изменено: Taveron, 2021-11-03 23:05:32)

Re: AHK: Макрос подсчета разницы

teadrinker, горячая клавиша нажимается после ввода числа, а значит документ изменён.

62

Re: AHK: Макрос подсчета разницы

Taveron
Интересный вариант, немного подправил его только:

F2::
ToolTip, Введите число,0,0		; Отобразить инфу.
Loop{
 Input, Var, V, {Space}			; Записываем нажатия пока не будет нажат пробел.
 if RegExMatch(Var, "\d+$", Var){	; Если в конце записанной строки есть число, то
  Send % 10000-Var			; производим с ним вычисления и записываем результат после пробела.
  ToolTip				; Убрать инфу.			
  Break					; Прервать перехват клавиш.
 }
}
Return
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

63

Re: AHK: Макрос подсчета разницы

teadrinker пишет:

критичный недостаток — отсутствие ClipWait.

  Для 3-4 символов? Вы правы.

64

Re: AHK: Макрос подсчета разницы

Taveron пишет:

teadrinker, горячая клавиша нажимается после ввода числа, а значит документ изменён.

Число уже есть в файле, как я понял. На скриншоте не изменённый документ.

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

65 (изменено: stuermer, 2021-11-03 23:56:34)

Re: AHK: Макрос подсчета разницы

teadrinker пишет:

Число уже есть в файле, как я понял. На скриншоте не изменённый документ.

В измененном документе после ввода числа перед именем файла появляется звездочка:
"*name.txt - Блокнот"
Но и со звездочкой не запускается макрос. Попробую AU3_Spy.exe завтра.

66

Re: AHK: Макрос подсчета разницы

teadrinker пишет:

Используйте AU3_Spy.exe (который идёт вместе с AHK)

teadrinker, вы где её откопали? Пользуюсь AHK пару лет и никогда такой проги не видел в комплекте. Всегда пользовался WindowSpy.ahk.

67

Re: AHK: Макрос подсчета разницы

AhkSpy - круче всех.

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

68

Re: AHK: Макрос подсчета разницы

Taveron пишет:

вы где её откопали?

А, просто перепутал, она наверно раньше была в комплекте, сейчас не знаю.

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

69

Re: AHK: Макрос подсчета разницы

Скопировал название окна из WindowSpy.ahk:

#If WinActive("*name.txt – Блокнот")
^Numpad8::
   ClipBoard := ""
   Send, +^{Left}
   Sleep, 50
   Send ^c
   ClipWait, 1
   SendInput, % 10000 - Clipboard
Return

Все равно не работает в этом окне.

70

Re: AHK: Макрос подсчета разницы

Заработало после перезагрузки:

#If WinActive("*name.txt – Блокнот")
^Numpad8::
   ClipBoard := ""
   Send ^{sc1E}  ; Ctrl+A
   Sleep 50
   Send ^{sc2E}  ; Ctrl+C
   ClipWait, 1
   SendInput, % 10000 - Clipboard
Return

71

Re: AHK: Макрос подсчета разницы

Перезагрузка не причём, наверно просто скрипт забыли сохранить. Разница между этим вариантом, и тем, что привели в первый раз, в том, что в окне используется не тот дефис, который можно ввести с клавиатуры. Чтобы работало с сохранённым и не сохранённым документом, лучше такой вариант:

SetTitleMatchMode, 2
#If WinActive("name.txt ahk_class Notepad")

(читайте про SetTitleMatchMode).

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

72 (изменено: stuermer, 2021-11-04 19:47:54)

Re: AHK: Макрос подсчета разницы

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

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

73

Re: AHK: Макрос подсчета разницы

Скрипт в студию!

74

Re: AHK: Макрос подсчета разницы

Данный макрос точно не при чём.

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

75 (изменено: stuermer, 2021-11-04 21:44:42)

Re: AHK: Макрос подсчета разницы

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

Подскажите еще, почему может не работать горячая строка автозамены:

:*:ghd::Привет
Send {RCtrl Down}{RCtrl Up}
return

т.е. "Привет" вводится, а язык по правому Ctrl не меняется на русский.

76

Re: AHK: Макрос подсчета разницы

Вы собираетесь все вопросы в этой теме задавать?

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