Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » AutoHotkey

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

Открыть новую тему     Написать ответ в эту тему

chum2000

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

   
 
Актуальная версия: AutoHotkey 2.0.5 от 12 августа 2023
Версия для Windows XP | Changes from v1.1 to v2.0
 
Официальный сайт | Англоязычный форум | Архивный форум | Русскоязычный форум
Документация (англ.) | Документация и статьи (рус.) | История изменений
 
Подборка полезных скриптов | AutoHotkey + Total Commander
 

Цитата:
AutoHotkey — бесплатная программа с открытым исходным кодом для создания макросов и автоматизации, позволяющая упростить выполнение повторяющихся задач.
 
AutoHotkey позволяет изменить интерфейс практически любой программы. Имеет собственный скриптовый язык, специально нацеленный на лёгкое назначение и переназначение горячих клавиш.
 
AutoHotkey можно использовать для запуска программ, отправки текста, имитации мыши. Скриптовый язык позволяет управлять окнами, файлами и папками. Команды могут быть активированы горячими клавишами.
 
Также имеются возможности создания GUI, работы с реестром, использования собственного API окон для вызова DLL-файлов. Скрипты можно скомпилировать в EXE-файл и запускать на любом компьютере с Windows соответствующей версии.
 
Наиболее частое применение AutoHotkey:
- переназначение клавиш (глобально или у отдельных программ)
- управление мышью с помощью клавиатуры или джойстика
- слежение за системой, автоматическое выполнение некоторых действий по желанию пользователя, таких как напоминание, сканирование или резервное копирование
 

Всего записей: 505 | Зарегистр. 04-03-2004 | Отправлено: 00:28 02-06-2005 | Исправлено: Egor2020, 10:08 21-09-2023
LonerDergunov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно ли дождаться выполнения SendInput и после этого производить дальнейшие манипуляции?
Надо вставить текст, а потом нажать кнопочку:

Код:
SendInput {Raw}Длинная последовательность символов.....
ControlClick, Button1, ahk_class Window

Send работает очень медленно, а SendInput не успевает ввести весь текст - вводится только несколько символов, и нажимается кнопка).
(наверное, в моём случае правильнее будет вставлять текст через ControlSetText, но всё-равно интересно про Send)

Всего записей: 2972 | Зарегистр. 11-07-2007 | Отправлено: 05:54 28-04-2013 | Исправлено: LonerDergunov, 05:56 28-04-2013
LonerDergunov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Каким образом отжать все клавиши?
Конкретно - пользовать нажимает хоткей, по которому срабатывают команды отправки нажатий ControlSend.
Если нажать и отпустить хоткей - всё нормально, а вот если нажать и зажать - ControlSend не всегда отрабатывает. BlockInput не помогает. Частное решение - отжать предварительно клавиши хоткея, например, ControlSend, Control, {Alt down}{Shift up}{sc01E up}, ahk_class ClassNN . Но если заранее хоткей неизвестен - хотелось бы для гарантии отжать все клавиши.

Всего записей: 2972 | Зарегистр. 11-07-2007 | Отправлено: 21:54 28-04-2013 | Исправлено: LonerDergunov, 21:56 28-04-2013
Risovod



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте. Помогите сделать скрипт, чтобы после появления текста в окне нажималась кнопка.
Вот скрин
Пробовал различными способами, но не получается:
WinWait, Static2 Готов к подключению (безопасное соединение)
IfWinExist, TeamViewer, WinText="Готов к подключению (безопасное соединение)"
P.S. Скрипт для нажатия кнопки я знаю, нужно создать условие по тексту.

Всего записей: 939 | Зарегистр. 12-11-2006 | Отправлено: 23:44 28-04-2013
creature_ws



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Можно ли дождаться выполнения SendInput и после этого производить дальнейшие манипуляции?  

Так и происходит.

Цитата:
SendInput не успевает ввести весь текст

SendInput успевает «генерировать нажатия», а приложение не успевает их обработать прежде чем получает следующую команду.

Цитата:
Send работает очень медленно

SetkeyDelay управляет длительностью пауз в режиме SendEvent.
 

Цитата:
а вот если нажать и зажать - ControlSend не всегда отрабатывает.

ControlSend отрабатывает всегда, это приложение не успевает обработать «сыплющиеся в него сообщения».
При удержании клавиши зажатой начинает генерироваться автоповтор нажатий. Каждое нажатие перехватывается скриптом и… В общем, используйте в подпрограмме горячей клавиши KeyWait.

Цитата:
хотелось бы для гарантии отжать все клавиши.

Так и происходит «не отжимаются» клавиши модификаторов при использовании {Blind}, клавиша запускающая подпрограмму и так «не нажимается».
 
Risovod, если данный текст отображается в разделе "Visible window text", то используйте  

Код:
WinWait, TeamViewer, Готов к подключению


Всего записей: 304 | Зарегистр. 29-07-2008 | Отправлено: 02:54 29-04-2013 | Исправлено: creature_ws, 03:08 29-04-2013
LonerDergunov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
creature_ws

Цитата:
SendInput успевает «генерировать нажатия», а приложение не успевает их обработать прежде чем получает следующую команду...

Понятно, важное отличие от простого Send.
Значит Send ждёт генерирования всех нажатий, и только после этого передаёт управление следующей команде, а SendInput работает быстрее, но на самом деле менее надёжно (хотя в справке и сказано обратное) и не дожидается окончания ввода всех нажатий.
 

Цитата:
В общем, используйте в подпрограмме горячей клавиши KeyWait.

Спасибо, работает в частном случае.
А вот если заранее не известно - какие клавиши нажаты?  
Есть ли в AHK какое-нибудь средство (команда, функция) для принудительного отжатия ВСЕХ клавиш или хотя бы ожидания их отжатия?

Всего записей: 2972 | Зарегистр. 11-07-2007 | Отправлено: 04:17 29-04-2013
creature_ws



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
не дожидается окончания ввода всех нажатий

Неверный вывод.  
«Окончание ввода» замечаете вы, «когда буковки в поле ввода отрисовались тогда ввод и окончен».
 
SendEvent и SendInput генерируют нажатия. После того, как нажатия «отправлены», работа этих команд окончена. То, что в каком-то приложении при использовании SendInput «буковки не успевают отрисовываться» — проблема приложения, не команды. SendInput

Цитата:
А вот если заранее не известно - какие клавиши нажаты?  

Это не имеет значения, если зажаты клавиши-модификаторы, ControlSend и Send «отожмут» их перед отправкой нажатий.

Цитата:
Есть ли в AHK какое-нибудь средство

Средство называется «справка» судя по вашим предположениям, вам нужно систематизировать имеющиеся знания, иначе от неуместных предположений не удастся избавиться и в дальнейшем они продолжат подталкивать вас к поиску решений вымышленных проблем.

Всего записей: 304 | Зарегистр. 29-07-2008 | Отправлено: 04:43 29-04-2013
LonerDergunov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
creature_ws

Цитата:
Это не имеет значения, если зажаты клавиши-модификаторы, ControlSend и Send «отожмут» их перед отправкой нажатий.

Автоматически - не отжимают. В этом и вопрос.
Конкретно - имеется программа BulkFileChanger.
Программа открыта и в неё перетащены файлы.  
 
Нужно нажать хоткей (для примера у меня Shift+Alt+A, но это могут быть любые заранее неизвестные клавиши), вызывается скрипт, который выделяет все файлы (эмуляция нажатия Ctrl+A) и открывает диалоговое окно изменения атрибутов этих файлов (эмуляция нажатия F6).
Скрипт:

Код:
WinWait, ahk_class BulkFileChanger
ControlFocus, SysListView321, ahk_class BulkFileChanger
;ControlSend, SysListView321, {Alt down}{Shift up}{Ctrl up}{sc01E up}, ahk_class BulkFileChanger
; или
;KeyWait, sc01E
;KeyWait, Shift
;KeyWait, Alt
ControlSend, SysListView321, {Ctrl down}{sc01E}{Ctrl up}, ahk_class BulkFileChanger
ControlSend, SysListView321, {F6}, ahk_class BulkFileChanger
 

Если нажать хоткей и зажать его - то скрипт не отработает, ControlSend НЕ "отожмёт" эти зажатые клавиши перед отправкой нажатий.
Да, в частном случае решение есть - раскомментировать закомментированную строку с ControlSend или же три закомментированные строки с KeyWait. Тогда скрипт отрабатывает чётко. Но это решение для частного случая когда заранее известно что именно эти клавиши могут быть зажаты. А если не известно ?  
 

Цитата:
Средство называется «справка»  судя по вашим предположениям, вам нужно систематизировать имеющиеся знания

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

Всего записей: 2972 | Зарегистр. 11-07-2007 | Отправлено: 05:17 29-04-2013 | Исправлено: LonerDergunov, 05:19 29-04-2013
creature_ws



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
 
$^+vk41::
    WinWait, ahk_class BulkFileChanger ; Дождались появления окна с указанным классом.
    SetKeyDelay, 20, 20
    ControlSend SysListView321, ^{vk41}{F6} ; Отправили в появившееся окно нажатия
    KeyWait vk41 ; дождались физического отпускания клавиши
    return
 


Всего записей: 304 | Зарегистр. 29-07-2008 | Отправлено: 05:32 29-04-2013
aidomars



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

FileSetTime
Изменяет отметку даты и времени одного или нескольких файлов или папок. Поддерживаются шаблоны.
FileSetAttrib
Изменяет атрибуты одного или нескольких файлов или папок. Поддерживаются шаблоны.
Loop (файлы и папки)
Возвращает указанные файлы или папки по одному/одной.  
FileCopy
Копирует один или несколько файлов.  
Run / RunWait
Запускает указанную программу, открывает документ.
 
Проще самому написать, в Autohotkey все эти фунции есть.

Всего записей: 982 | Зарегистр. 23-04-2007 | Отправлено: 07:42 29-04-2013
LonerDergunov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
creature_ws

Цитата:
Проще самому написать, в Autohotkey все эти фунции есть.

А где слово "Сарказм" ? . Написать свой GUI-интерфейс и повторить все или хотя бы некоторые возможности упомянутой программы - это мне пока что совсем непросто.
 
creature_ws
Спасибо. Теперь чётко отрабатывает.
Всё дело в параметре PressDuration команды SetKeyDelay. И никакая справка не поможет осмыслить этот нюанс без сторонней подсказки.

Всего записей: 2972 | Зарегистр. 11-07-2007 | Отправлено: 17:22 29-04-2013 | Исправлено: LonerDergunov, 20:24 29-04-2013
oshizelly



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LonerDergunov 20:06 24-04-2013
Цитата:
Тогда всё просто:  
 
Код: #If (A_Cursor = "IBeam")  
 {  
 Insert::return  
 NumpadIns::return  
 }

Не знаю, является ли это неизбежным результатом, но при включении этого скрипта клавиша Insert перестаёт работать даже и вне текстовых полей. Например перестаёт работать выделение файлов клавишей Insert в Total Commander.
 
А вот комбинация Shift+Insert (дефолтный хоткей в Windows для вставки данных из буфера обмена) вполне работает.

Всего записей: 6524 | Зарегистр. 18-09-2004 | Отправлено: 17:37 29-04-2013
aidomars



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
А где слово "Сарказм" ?  

Какой сарказм? Не такая уж и сложная программа, зато опыт приобретешь.

Всего записей: 982 | Зарегистр. 23-04-2007 | Отправлено: 17:49 29-04-2013
LonerDergunov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
зато опыт приобретешь.

Для начала лучше на кошечках потренируюсь, иначе вопросами задолбаю ))
 

Цитата:
Не знаю, является ли это неизбежным результатом, но при включении этого скрипта клавиша Insert перестаёт работать даже и вне текстовых полей. Например перестаёт работать выделение файлов клавишей Insert в Total Commander.

Я тоже не знаю, у меня выделение работает.
Insert отключается только в том случае, если сам курсор находится над текстовым полем (вид курсора изменён со стрелочки на вертикальную черту). В Тотале может не работать выделение (при запущенном скрипте) только в случае когда включено отображение командной строки и сам курсор находится над полем ввода командной строки.
Насчёт Shift+Insert - в коде затрагивается только нажатие самого Insert, а модификатор+Insert продолжают работать штатно.

Всего записей: 2972 | Зарегистр. 11-07-2007 | Отправлено: 20:50 29-04-2013
oshizelly



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LonerDergunov 19:50 29-04-2013
Цитата:
 В Тотале может не работать выделение (при запущенном скрипте) только в случае когда включено отображение командной строки и сам курсор находится над полем ввода командной строки.

Ну да, я так и понял, что должно именно таким образом работать. Вот только почему-то на самом деле работает по-другому.
Командная строка в Total Commander у меня вообще по дефолту спрятана, так что курсор никак не может оказаться там случайно: это сразу становится заметно. Вот только что ещё раз перепроверил.
 
И совпадения тоже исключены, зависимость 100%: загружаю скрипт - Insert не работает, выгружаю - опять работает, снова загружаю - опять не работает...
 
Может, можно TC как-то добавить в исключения для работы скрипта? На самом деле там-то он точно не нужен.

Всего записей: 6524 | Зарегистр. 18-09-2004 | Отправлено: 20:59 29-04-2013
LonerDergunov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oshizelly

Цитата:
 TC как-то добавить в исключения для работы скрипта?


Код:
#persistent
#If (A_Cursor = "IBeam")
#IfWinNotActive, ahk_class TTOTAL_CMD
{
  Insert::return
  NumpadIns::return
}

Всего записей: 2972 | Зарегистр. 11-07-2007 | Отправлено: 21:10 29-04-2013 | Исправлено: LonerDergunov, 23:58 29-04-2013
creature_ws



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
#If (A_Cursor = "IBeam")
#IfWinNotActive, ahk_class TTOTAL_CMD  

Почему вы считаете такую конструкцию верной?

Всего записей: 304 | Зарегистр. 29-07-2008 | Отправлено: 21:33 29-04-2013
oshizelly



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LonerDergunov 20:10 29-04-2013
Цитата:
 TC как-то добавить в исключения для работы скрипта?

Спасибо!
 
creature_ws 20:33 29-04-2013
Цитата:
Код: #If (A_Cursor = "IBeam")  
 #IfWinNotActive, ahk_class TTOTAL_CMD    
 Почему вы считаете такую конструкцию верной?

 
Я не знаю, правильна ли эта конструкция с теоретической точки зрения - но подтверждаю, что она работает! Как сказал основоположник, "учение Маркса истинно, потому что оно верно" "практика - вот критерий истины".

Всего записей: 6524 | Зарегистр. 18-09-2004 | Отправлено: 22:23 29-04-2013
creature_ws



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 но подтверждаю, что она работает!

Учитывается последняя директива, расположенная выше — игнорируется.
Давайте «практично» пихать в код «всё, что лезет», раз интерпретатор не ругается, значит всё делаем правильно, плевать на логику.

Всего записей: 304 | Зарегистр. 29-07-2008 | Отправлено: 22:30 29-04-2013
LonerDergunov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Учитывается последняя директива, расположенная выше — игнорируется.

Да, уже понял: #If and #IfWin are also mutually exclusive...
 

Цитата:
интерпретатор не ругается

Зря. Лучше бы ругался.
И множественные варианты записи (необязательные запятые, кавычки, переменные с одним и двумя %, повторяющие друг друга команды...) - тоже зря, удобства не доставляют, зато запутывают, во всяком случае на первых порах.
В версии 2 сделан имхо правильный шаг в отношении строгости языка.
 

Цитата:
 плевать на логику.

Логика вместе с фантазией зашли в тупик после перебора разных вариантов объединения IfWinNotActive, #IfWinNotActive, If, #If, Hotkey...
PS. Пробовал ещё. Сдаюсь. Ничего рабочего так и не смог придумать

Всего записей: 2972 | Зарегистр. 11-07-2007 | Отправлено: 23:57 29-04-2013 | Исправлено: LonerDergunov, 22:40 30-04-2013
OnMyDSeeAtAll



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
#If, CheckUp(getStyle, WinActive("A")) And Not getStyle>>11&1
   
Ins::
   
Numpad0::
   
NumpadIns::Return
 
CheckUp(ByRef sCtrl, hWnd)
{
   
ControlGetFocus,
nCtrl, % "ahk_id"hWnd
   
ControlGet, sCtrl, Style,, % nCtrl, % "ahk_id"hWnd
   
ControlGet, lCnt, LineCount,, % nCtrl, % "ahk_id"hWnd
   
Return, lCnt
}

Всего записей: 100 | Зарегистр. 08-07-2011 | Отправлено: 04:45 30-04-2013
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

Компьютерный форум Ru.Board » Компьютеры » Программы » AutoHotkey


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru