Тема: AHK: Макрос подсчета разницы
Добрый день,
подскажите как сделать, чтобы при вводе $$число автоматически считалась и вводилась разница 10000 - число, где число < 10000.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Добрый день,
подскажите как сделать, чтобы при вводе $$число автоматически считалась и вводилась разница 10000 - число, где число < 10000.
А сам числа в каком виде? В файле? Или надо каждое вводить?
Foma
каждый раз вводится вручную в notepad в виде $$число, например: ввожу $$5894, а макрос корректирует после пробела на 4103 (=10000 - 5894).
Чтобы скопировать в буфер нужна Send с шифтом и "Home", потом обычный Ctrl+C. Чтобы убрать первые два символа смотрите в справке StringTrimLeft. Дальше математика, потом для записи смотрите команду Send.
Foma
А математика как? Там же переменные надо определять.
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}"
}
Лимит числа <1000 не учитывается в коде.
Ещё плюс вечный перехват клавиш.
И что, у вас не работает?
Код рабочий в целом, но в шапке условие:
где число < 10000.
Например можно ввести 999999 и АХК выдаст ответ "-989999 ".
Ну вот пусть автор вопроса и подумает, как проверку добавить, если нужно.
Ха, научили человека AHK, сначала выдали готовое, потом что-то вспомнили...
На ошибках и примерах учатся. Разве не так? Некоторые варианты кода фиг где найдёшь если не показать.
Ну вот пусть автор вопроса и подумает, как проверку добавить, если нужно.
Да не нужна там проверка, я 10000 для примера написал. Спасибо.
Что-то не работает этот код у меня.
У меня шапке стоят такие директивы:
#NoEnv ; For security
#SingleInstance force
#Persistent
SendMode Input
Еще сделал такое условие:
#IfWinActive name.txt Блокнот
...
return
Но и без условия не работает.
На ошибках и примерах учатся. Разве не так? Некоторые варианты кода фиг где найдёшь если не показать.
Я бы решал на другом уровне. И для новичка именно такой и нужен, как по мне. Выделить, скопировать, отрезать, вставить. Код из простых команд с подробным описанием. А вы показываете как прибавить 3 к 5 с помощью рядов Тейлора и теории относительности. Я сколько лет пользуюсь на примитивном уровне AHK и в дебри так и не влез. А вы новичка в такое
(RegExMatch(Hook.Input, "O)\$\$(\d+)\s", m))
погружаете. Что он вынесет? Ощущение мистики и ноль на выходе. КМК.
Выделить, скопировать, отрезать, вставить
Ну так приведите рабочий пример, или хотя бы объясните алгоритм, чтобы было на чём учиться.
погружаете. Что он вынесет? Ощущение мистики и ноль на выходе. КМК.
Да согласен, в коде ничего не понял, кроме названий функций и изменить код сам не смогу ((.
Вот и я об этом.
Причем и префикс $$ уже не нужен, если всё только в Блокноте происходить будет.
Foma
Я не показывал свой код, он у меня более громоздкий и написан уже тогда, когда не так важен.
Я сколько лет пользуюсь на примитивном уровне AHK и в дебри так и не влез
Это уже ваши проблемы. Учится всё равно нужно.
Что он вынесет?
Новые команды, которые ему позволят (если начнёт изучать их) новые решения тех или иный проблем.
Да согласен, в коде ничего не понял, кроме названий функций и изменить код сам не смогу ((.
Так а в чём проблема почитать документацию? Если после прочтения остаются вопросы, можете задавать их здесь. Что касается RegEx — это действительно непростая штука, но другого способа понять эту тему, кроме постепенного изучения, не существует.
А что с помощью StringTrimLeft никак нельзя отрезать два лишних символа спереди? И понятнее в разы будет. И подправить сможет когда понадобится.
Foma, я не понял вашу идею, напишите код.
Да согласен, в коде ничего не понял, кроме названий функций и изменить код сам не смогу.
Может так будет чуть более понятней:
Loop {
Input, Var, V, {Space} ; Записываем нажатия пока не будет нажат пробел.
if RegExMatch(Var, "\d+$", Var) ; Если в конце записанной строки есть число, то
Send % 10000 - Var ; производим с ним вычисления и записываем результат после пробела.
}
Ну, мне кажется, что описанная задача проще всего и нагляднее всего решается вот так:
^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
Loop { Input, Var, V, {Space} ; Записываем нажатия пока не будет нажат пробел. if RegExMatch(Var, "\d+$", Var) ; Если в конце записанной строки есть число, то Send % 10000 - Var ; производим с ним вычисления и записываем результат после пробела. }
Красиво, но тоже не работает чего-то.
Ну, мне кажется, что описанная задача проще всего и нагляднее всего решается вот так:
Во-первых, у меня так не работает:
Во-вторых, это немного другая задача, ваш скрипт не реагирует на ввод определённого паттерна, а пытается выполнять действия по горячей клавише. В-третьих, если мы выполняем действия по горячей клавише, какой смысл вводить $$ и потом их убирать с помощью StringTrimLeft (которая, кстати, deprecated) ?
красиво, но тоже не работает чего-то
Всё прекрасно работает, как и мой вариант. Вы запускаете код, как есть?
stuermer пишет:красиво, но тоже не работает чего-то
Всё прекрасно работает, как и мой вариант. Вы запускаете код, как есть?
Нет, у меня в одном файле куча разных макросов и в шапке:
#NoEnv ; For security
#SingleInstance force
#Persistent
SendMode Input
Для начала проверьте, как есть.
Для начала проверьте, как есть.
Заработало в отдельном файле, спасибо. Но пишет новое число рядом, а надо, чтобы вместо старого перезаписало.
Теперь мой проверьте (там с $$).
Только предыдущий пост не надо цитировать.
teadrinker
Тоже работает и перезаписывает, но оба варианта не реагируют на:
#IfWinActive name.txt Блокнот
...
return
и работают не только в блокноте.
#IfWinActive — это директива только для горячих клавиш. В мой код можно добавить проверку, какое окно активно, и выполнять действия, только если активно подходящее.
Теперь покажите вариант кода, который у вас не работает.
teadrinker
Ну и по горячей клавише можно это делать. Не надо, чтобы постоянно код выполнялся, а вышел по return.
Так у вас, я так понял, этот код же работает?
teadrinker Еще не пробовал, я так понял его подправить надо.
Я думал, раз плюсик поставили, работает. А что мешает попробовать?
Плюсик за идею был. Переделал так (без префикса $$):
^Numpad8::
ClipBoard := ""
Send {Shift Down}{Home}{Shift Up}
Send {Ctrl Down}{sc1E}{Ctrl Up}
var1 := ClipBoard
Send {Del}
Send % 10000 - var1
return
но все равно не работает, только удаляет число. Подскажите, почему не посылает разницу?
Вот эта конструкция
Send {Shift Down}{Home}{Shift Up}
Send {Ctrl Down}{sc1E}{Ctrl Up}
выглядит, во-первых, диковато, во-вторых, по Shift + Home будет выделяться вся строка с конца до начала. Это действительно то, что нужно?
teadrinker да, выделяется всё число, потом копируется в буфер (если иначе нельзя его присвоить переменной), потом удаляется выделенное и потом хочу на его место вставить разницу.
Это число обязательно будет написано в начале строки?
Да, это отдельный файл только для этой цели. Там хранится это число.
Если это число в файле, зачем его вообще открывать в блокноте, не проще прочитать прямо из файла?
Нет, число (разница) вводится туда ежемесячно вручную, а потом в определенный день (по напоминалке), тоже вручную оно оттуда считывается. Этот файл с числом в уменьшенном окошке Блокнота используется как форма ввода, хранения и вывода напоминания.
Ясно, сложная система. После отправки Ctrl + C текст в буфер обмена попадает не сразу, нужно использовать ClipWait, чтобы дождаться его.
Вот так должно работать на текущей версии AHK:
#If WinActive("ahk_class Notepad")
^Numpad8::
ClipBoard := ""
Send, +^{Left}
Sleep, 50
Send ^c
ClipWait, 1
SendInput, % 10000 - Clipboard
Return
выглядит, во-первых, диковато, во-вторых, по Shift + Home будет выделяться вся строка с конца до начала. Это действительно то, что нужно?
Да, громоздко. Но прозрачно, что главное для таких как я и начинающих. Даже через год заглянешь в код и всё ясно. Можно что-то добавить или изменить.
Я так и понял stuermer, что каждое число в отдельной строке. Странно это было бы видеть в непрерывной строке.
Да, я теперь понял. Но в коде, который вы запостили, всё равно есть критичный недостаток — отсутствие ClipWait.
Да работает, спасибо.
Почему не был рассмотрен вариант с автозаменой? Можно было бы реагировать на ввод тех же $$ автоматически.
Покажите код, рассмотрим!
Но если я хочу макрос ограничить только на конкретный файл в блокноте, то не работает:
#If WinActive("name.txt - Блокнот")
#If WinActive name.txt ahk_class Notepad
Что не так делаю?
Значит название неправильно написали.
#If WinActive name.txt ahk_class Notepad
Так вообще нельзя, #If работает только с функцией WinActive(), а с командой WinActive нет.
teadrinker
#If WinActive("name.txt - Блокнот")
Тоже не работает.
Используйте AU3_Spy.exe (который идёт вместе с AHK) для получения точного названия окна. Вы ведь, скорее всего, просто вручную набрали.
stuermer, у вас заголовок меняется в зависимости от того, сохранён документ или нет. Используйте SetTitleMatchMode.
SetTitleMatchMode, 2
#IfWinActive, name.txt
Taveron, верно, но здесь проблема не только в этом. Тем более, что горячая клавиша нажимается, когда документ ещё не изменён.
teadrinker, горячая клавиша нажимается после ввода числа, а значит документ изменён.
Taveron
Интересный вариант, немного подправил его только:
F2::
ToolTip, Введите число,0,0 ; Отобразить инфу.
Loop{
Input, Var, V, {Space} ; Записываем нажатия пока не будет нажат пробел.
if RegExMatch(Var, "\d+$", Var){ ; Если в конце записанной строки есть число, то
Send % 10000-Var ; производим с ним вычисления и записываем результат после пробела.
ToolTip ; Убрать инфу.
Break ; Прервать перехват клавиш.
}
}
Return
критичный недостаток — отсутствие ClipWait.
Для 3-4 символов? Вы правы.
teadrinker, горячая клавиша нажимается после ввода числа, а значит документ изменён.
Число уже есть в файле, как я понял. На скриншоте не изменённый документ.
Число уже есть в файле, как я понял. На скриншоте не изменённый документ.
В измененном документе после ввода числа перед именем файла появляется звездочка:
"*name.txt - Блокнот"
Но и со звездочкой не запускается макрос. Попробую AU3_Spy.exe завтра.
Используйте AU3_Spy.exe (который идёт вместе с AHK)
teadrinker, вы где её откопали? Пользуюсь AHK пару лет и никогда такой проги не видел в комплекте. Всегда пользовался WindowSpy.ahk.
AhkSpy - круче всех.
вы где её откопали?
А, просто перепутал, она наверно раньше была в комплекте, сейчас не знаю.
Скопировал название окна из WindowSpy.ahk:
#If WinActive("*name.txt – Блокнот")
^Numpad8::
ClipBoard := ""
Send, +^{Left}
Sleep, 50
Send ^c
ClipWait, 1
SendInput, % 10000 - Clipboard
Return
Все равно не работает в этом окне.
Заработало после перезагрузки:
#If WinActive("*name.txt – Блокнот")
^Numpad8::
ClipBoard := ""
Send ^{sc1E} ; Ctrl+A
Sleep 50
Send ^{sc2E} ; Ctrl+C
ClipWait, 1
SendInput, % 10000 - Clipboard
Return
Перезагрузка не причём, наверно просто скрипт забыли сохранить. Разница между этим вариантом, и тем, что привели в первый раз, в том, что в окне используется не тот дефис, который можно ввести с клавиатуры. Чтобы работало с сохранённым и не сохранённым документом, лучше такой вариант:
SetTitleMatchMode, 2
#If WinActive("name.txt ahk_class Notepad")
(читайте про SetTitleMatchMode).
teadrinker Спасибо, но там как раз лучше, чтобы только со звездочкой работало - чтобы по ошибке старое или сохраненное число не конвертировать.
Тут другая проблема возникла: если загружаю этот макрос вместе с другими в одном файле (а это удобно, чтобы не было несколько иконок в трее для каждого скрипта), то после первого срабатывания этого макроса начинают глючить клава и мышь. Только перезагрузка помогает.
Скрипт в студию!
Данный макрос точно не при чём.
Поместил этот макрос в отдельный файл и убрал #Persistent в обоих, вроде глючить перестало. В первом файле остались горячие строки, клавиши и макрос этой темы.
Подскажите еще, почему может не работать горячая строка автозамены:
:*:ghd::Привет
Send {RCtrl Down}{RCtrl Up}
return
т.е. "Привет" вводится, а язык по правому Ctrl не меняется на русский.
Вы собираетесь все вопросы в этой теме задавать?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться