Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

AutoHotkey

Автор Квас, сентября 8, 2010, 11:42

0 Пользователи и 1 гость просматривают эту тему.

O

Цитата: Квас от января 25, 2012, 12:28
В начале #IfWinExist решётка стоит.

Не-а. Оно само сгенерилось именно так, без решётки. Если её поставить, то ругается на то, что элс без иф.

gdy padła granica, pękły więzień bramy,
w ten dzień wyzwolenia: siedemnasty września

Квас

Не за что. Мне кажется, я уже всему ЛФ голову забил этим AHK, так что теперь положение обязывает. :)

Горячая строка ваша должна нормально работать по идее. Файл в utf-8?
Пишите письма! :)

Квас

Прошу прощения, невнимательно прочитал. Вообще, решётками начинаются команды, устанавливающие опции для горячих строк и клавиш. Здесь просто управляющая команда, решётки действительно не нужны.

У меня заработало, когда поставил SetTitleMatchMode, 2 и в названии окна оставил только «Блокнот». Очевидно, потому что там не дефис, а тире: —. Тире я выловил с помощью Window Spy, который вызывается из контекстного меню к любому скрипту.
Пишите письма! :)

O

Цитата: Квас от января 25, 2012, 12:40
Горячая строка ваша должна нормально работать по идее. Файл в utf-8?

Да, в utf-8 заработало. Но пришлось менять кодировку в Блокноте, а то в том-редакторе-с-длинным-названием смена кодировки в окне редактирования не влияла на то, в каком формате он сохранял файл.
gdy padła granica, pękły więzień bramy,
w ten dzień wyzwolenia: siedemnasty września

O

Цитата: Квас от января 25, 2012, 12:51
У меня заработало, когда поставил SetTitleMatchMode, 2 и в названии окна оставил только «Блокнот». Очевидно, потому что там не дефис, а тире: —. Тире я выловил с помощью Window Spy, который вызывается из контекстного меню к любому скрипту.

Спасибо. Но пока практических применений AHK для себя я не нахожу.
gdy padła granica, pękły więzień bramy,
w ten dzień wyzwolenia: siedemnasty września

O

Цитата: O от января 25, 2012, 13:02
Но пока практических применений AHK для себя я не нахожу.

Точнее, практические цели есть, но пока я справляюсь так, что мне проще запомнить код символа и вводить его, чем разбираться с AHK. Короче, процесс обещает затянуться.  :)
gdy padła granica, pękły więzień bramy,
w ten dzień wyzwolenia: siedemnasty września

Квас

Цитата: O от января 25, 2012, 13:00
в том-редакторе-с-длинным-названием смена кодировки в окне редактирования не влияло на то, в каком формате он сохраняет файл.

Да, у Scite бывают какие-то глюки с кодировками.

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

Цитата: O от января 25, 2012, 13:02
Но пока практических применений AHK для себя я не нахожу.

Можно просто полистать туториал и ждать, когда появятся задачи. Если приходится работать с документами, то самые обыкновенные автозамены могут оказаться очень полезными. А так — всякая мелкая и не очень автоматизация, при том что AHK умеет работать с окнами, запускать программы, общаться с Windows, позволяет легко программировать несложные окошки. Например, удобное переключение раскладок, большое число квазибуферов, ввод всяких разных символов. При необходимости скачать энное число файлов можно воспользоваться скриптом на несколько строк. Или, например, можно написать функцию, которая звёздочки заменяет на теги , и применять её к содержимому буфера обмена... Короче говоря, со временем задачи обязательно появятся.

Чтобы не быть голословным, вот кусок кода из постоянно работающего у меня скрипта. Включение раскладок по Ctrl и ассоциирование с каждой клавишей «буфера» (запись в буфер по Ctrl+Insert, <клавиша>; вставка из буфера — Shift+Insert, <клавиша>.

; Включение раскладки по Ctrl:

~LControl::SetLayout("English") ; по левому - английская
~RControl::SetLayout("Russian_mash") ; по правому - русская

; Чтобы клавиши сохранили обычную функциональность, нужно хотя бы раз их использовать в качестве префиксов.
LControl & Ins::
Input, BufferLabel, L1
SendInput, ^{sc2E}
Buffer%BufferLabel% := Clipboard
Return
RControl & Ins::
Input, BufferLabel, L1
SendInput, ^{sc2E}
Buffer%BufferLabel% := Clipboard
Return
+Ins::
Input, BufferLabel, L1
Clipboard := Buffer%BufferLabel%
SendInput, ^{sc2F}
Return

GetActiveKeyboardLayout()
{
WinGet, WinID,, A
ThreadID := DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
Return, InputLocaleID
}
SetLayout(Layout)
; The function accepts hexadecimal layout code or one of specific strings as its argument.
{
ControlGetFocus, C, A
If (Layout = "English")
PostMessage, 0x50,, 0x4090409, %C%, A
Else If (Layout = "Russian")
PostMessage, 0x50,, 0x4190419, %C%, A
Else If (Layout = "Russian_mash")
PostMessage, 0x50,, 0xf0080419, %C%, A
Else
PostMessage, 0x50,, %Layout%, %C%, A
}
Пишите письма! :)

Квас

Цитата: O от января 25, 2012, 13:16
Цитата: O от января 25, 2012, 13:02Но пока практических применений AHK для себя я не нахожу.
Точнее, практические цели есть, но пока я справляюсь так, что мне проще запомнить код символа и вводить его, чем разбираться с AHK. Короче, процесс обещает затянуться.  :)

Ну, фазу обучения никуда не денешь. :) Но по идее такие основные вещи как автозамены и горячие клавиши — это несложно. AHK создавался не для программистов.
Пишите письма! :)

Dmi3

Квасе, у меня к Вам вопрос. Посмотрел AutoHotkey. В принципе понравилось.

Вопрос такой. Хочу себе сымитировать Acme, но в Windows, для всей системы и с горячими клавишами вместо мыши. ☺ Хотя может я и мышь потом захочу, не знаю.

Можно ли так сделать:

1. При нажатии на горячую клавишу содержание буфера обмена рассматривается как команда: первое слово—название, остальное—как аргументы к ней; всё это запускается. Например, ls C:\dir запускает программу ls.exe (из системной папки) с аргументом C:\dir
2. Берётся текст из текущего выделения текущей программы (можна путём банальной посылки Ctrl-X, не обязательно 100% универсально), и этот текст передаётся запущенной программе в stdin; сам текст удаляется.
3. То, что команда пишет в stdout, выводится в программу (можно путём помещения в буфер и посылки в StdOut)
4. Если команда зависла, была бы неплоха возможность убиения её по какой-нибудь ещё горячей клавише.

???

В справке не нашёл ничего для работы с pipe'ами. Вижу такие варианты:
  • Использовать DllCall и CreateProcess... Получаем все прелести WinAPI. :uzhos: Зато гибко...
  • Записывать содержание «stdin»'а в файл (например, C:\temp\in.txt), а потом запускать cmd /c "нашаКоманда <C:\temp\in.txt >C:\temp\out.txt"[/tt] и вставлять в программу содержание файла out.txt  :-\ (вместо cmd можно использовать собственную программу на C, если возникнут вопросы с парсингом аргументов).

    В любом случае, хотелось бы сделать это относительно переносимым (только WinNT и уникод, 9x не надо): т.е. не забивать жёстко пути к C:\temp\in.txt, а брать системную временную папку.

O

gdy padła granica, pękły więzień bramy,
w ten dzień wyzwolenia: siedemnasty września

mnashe

Цитата: Ο от января 29, 2012, 13:55
Dmi3, вы форумом немножко не ошиблись?
Возможно, Demetrius предположил, что Квас уже сталкивался с такой задачей, и ему несложно будет подсказать.
Адепт единственного числа и безродового склонения
שָׁלוֹם עֲלֵיכֶם!

O

Цитата: mnashe от января 29, 2012, 14:24
Цитата: Ο от января 29, 2012, 13:55
Dmi3, вы форумом немножко не ошиблись?
Возможно, Demetrius предположил, что Квас уже сталкивался с такой задачей, и ему несложно будет подсказать.

Спасибо, Кэп!
gdy padła granica, pękły więzień bramy,
w ten dzień wyzwolenia: siedemnasty września

mnashe

Так и в чём тогда проблема?
По-моему, это нормально — спросить у товарищей, а уж если не знают — искать самому. Лама ло?
Адепт единственного числа и безродового склонения
שָׁלוֹם עֲלֵיכֶם!

Квас

Цитата: Dmi3 от января 28, 2012, 20:13
1. При нажатии на горячую клавишу содержание буфера обмена рассматривается как команда: первое слово—название, остальное—как аргументы к ней; всё это запускается. Например, ls C:\dir запускает программу ls.exe (из системной папки) с аргументом C:\dir

Это в принципе легко. Если строка представляет собой такую команду, которую можно дать в командную строку, то достаточно просто
Run, %Clipboard%
В более сложном случае можно распарсить Clipboard как обычную строку. Я что-то не понял, в какой «системной папке» должна искаться программа, а то мог бы и код написать.

Остальные надо посоображать.

Цитата: Dmi3 от января 28, 2012, 20:13
т.е. не забивать жёстко пути к C:\temp\in.txt, а брать системную временную папку.

В AHK много стандартных переменных, для доступа к временной папке можно использовать A_Temp.
Пишите письма! :)

Квас

Offtop
Кстати, буржуйский форум об AHK я иногда читаю, а наш почему-то никогда. Так что лично я очень доволен, что такие интересные обсуждения можно вести не уходя с ЛФ. :)
Пишите письма! :)

Квас

Цитата: Dmi3 от января 28, 2012, 20:13
2. Берётся текст из текущего выделения текущей программы (можна путём банальной посылки Ctrl-X, не обязательно 100% универсально), и этот текст передаётся запущенной программе в stdin; сам текст удаляется.
3. То, что команда пишет в stdout, выводится в программу (можно путём помещения в буфер и посылки в StdOut)
4. Если команда зависла, была бы неплоха возможность убиения её по какой-нибудь ещё горячей клавише.

Видимо, действительно самый простой метод — работать с файлами. (Если что, может оказаться полезной команда FileRead). Вот ещё какая-то штука нашлась:
http://www.autohotkey.com/forum/topic8606.html
Но я это уже плохо понимаю.

Для убиения можно пользоваться командами WinKill и Process.
Пишите письма! :)

O

Цитата: mnashe от января 29, 2012, 15:03
Так и в чём тогда проблема?

У вас проблема? Вы хотите об этом поговорить?  ;)
gdy padła granica, pękły więzień bramy,
w ten dzień wyzwolenia: siedemnasty września

Joris

有几个问题
1) Почему-то скрипт не хочет заменять y2 на ý (без комбайнов), хотя без проблем заменяет Y2 на Ý. Пришлось поставить комбайн: ý — так работает.
2) ::T//::Þ и ::t//::þ ни в какую не хотят работать. Результат — как будто я ничего не набирал.
3) Хотел настроить ударение в русском языке (гласная + два → гласная + ударение комбайном), но в этом случае комбайн не набирается (из скрипта пока убрал).
Spoiler: сам скрипт ⇓⇓⇓
yóó' aninááh

Квас

Нужно больше информации. :??? У меня всё работает (в том числе я заменил ý с комбайном на комбинированный).

Что касается последних автозамен, то они, наверно, работают не совсем так. Например, не получается набрать «привет» с большой буквы. Я бы просто отключил перед ними все включенные ранее опции путём #Hotstring C0?0... На самом деле стандартное ::<бла>::<бла> вполне естественно функционирует.
Пишите письма! :)

Joris

Цитата: Квас от июля  7, 2012, 12:14
Нужно больше информации. :??? У меня всё работает (в том числе я заменил ý с комбайном на комбинированный).
гм...
а что еще сообщить?
Цитата: Квас от июля  7, 2012, 12:14
Например, не получается набрать «привет» с большой буквы.
мне и не надо :) дело в том, что при переписке я вообще не ставлю большие буквы, а, например, в ворде автоматический вводу заглавных букв в начале предложения у меня включен.
Цитата: Квас от июля  7, 2012, 12:14
На самом деле стандартное ::<бла>::<бла> вполне естественно функционирует.
Не всегда так, как нужно.
yóó' aninááh

Квас

Может, интерференция с другими скриптами?
Пишите письма! :)

Joris

Цитата: Квас от июля  7, 2012, 12:24
Может, интерференция с другими скриптами?
У меня других нет.
А торн не хотел набираться даже тогда, когда он был просто вставлен в мою раскладку клавиатуры.
yóó' aninááh

Квас

Может в редакторе дело? А если просто скопипастить из таблицы символов?
Пишите письма! :)

Joris

Цитата: Квас от июля  7, 2012, 12:39
А если просто скопипастить из таблицы символов?
Ну дык я так и делал.
yóó' aninááh

Квас

И везде такой эффект? В разных редакторах, в браузере?
Пишите письма! :)

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр