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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Попробуй SetControlDelay

Спасибо. Тоже вариант. Но тоже лишь увеличивает шансы срабатывания, не давая гарантированного результата.
 


 
Как можно отследить и сделать активным контрол под курсором мыши, сохранив при этом весь остальной мышиный функционал?
Вот пример набросал - в Total Commanderе если подвести курсор мыши к правой или левой файловой панели, то она становится активной.

Код:
#NoEnv
#NoTrayIcon
#Persistent
#SingleInstance ignore
SetTimer subTimer, 200
subTimer:
if WinActive( "ahk_class TTOTAL_CMD" )
{
  MouseGetPos, ,,, mControl
  if ( mControl = "TMyListBox1" || mControl = "TMyListBox2" || mControl = "TMyListBox3" || mControl = "LCLListBox1" || mControl = "LCLListBox2" || mControl = "LCLListBox3" )
  ControlFocus, % mControl, ahk_class TTOTAL_CMD
}

 
Проблема в том, что при этом блокируются/не срабатывают клики мыши в файловых панелях. Если увеличить значение таймера SetTimer - то соответственно активация панелей будет происходить с существенной задержкой, и всё-равно при этом мышиные клики будут срабатывать не всегда.
Как же правильно решить задачу?

Всего записей: 2972 | Зарегистр. 11-07-2007 | Отправлено: 02:16 07-06-2014 | Исправлено: LonerDergunov, 02:16 07-06-2014
OnMyDSeeAtAll



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

Цитата:
Проблема в том, что...
У меня Ваш код ни каких проблем с мышью не выявил.
Цитата:
Как же правильно решить задачу?
Не знаю на счёт правильности, но как альтернативу команде ControlFocus можно использовать команду PostMessage по примеру из этой темы.

Всего записей: 100 | Зарегистр. 08-07-2011 | Отправлено: 08:01 07-06-2014 | Исправлено: OnMyDSeeAtAll, 08:21 07-06-2014
LonerDergunov



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

Цитата:
У меня Ваш код ни каких проблем с мышью не выявил.

Интересно. У меня Win 8.1 x 64, TC 8.51a (чистый) - двойные клики при запущенном скрипте не всегда работают. Пробовал оптимизировать - вначале узнать на каком контролле фокус, а потом передать фокус контроллу только в случае если он под куросором и не-в-фокусе. Не помогло. Возможно, особенность программы (программы+ОС) - частые ControlGetFocus/ControlFocus "глушат" двойные клики - время между кликами должно быть меньше, чем время опроса панелей таймером.
Попробовал по аналогии передавать фокус в проводнике Win 8.1 x 64 между деревом каталогов слева и файловой панелью - скрипт работает отлично даже при очень частом таймере.
 

Код:
#NoEnv
#NoTrayIcon
#Persistent
#SingleInstance ignore
SetTimer subTimer, 10
subTimer:
if WinActive( "ahk_class CabinetWClass" )
{
  ControlGetFocus, mFocus, ahk_class CabinetWClass
  MouseGetPos,,,, mControl
  if (( mControl = "DirectUIHWND3" || mControl = "SysTreeView321" ) && mFocus != mControl )
  ControlFocus, % mControl, ahk_class CabinetWClass
}

 
Спасибо за вариант с PostMessage, работает стабильно. Думал уже о чём-то подобном, но если делать вариант для общего случая - получится совсем неэлегантно, и слишком много вычислений постоянно придётся выполнять скрипту... PS. Ой мамочки... сколько проверок нужно будет делать...
 
Не очень понятны фрагменты кода:
SetTimer, % "SubTimer", 250 - почему знак процента и название таймера в кавычках?
Exit, (mControl) And mControl:="" - возвращаем mControl? (куда, почему в скобочках?) и очищаем его значение?

Всего записей: 2972 | Зарегистр. 11-07-2007 | Отправлено: 18:29 07-06-2014 | Исправлено: LonerDergunov, 22:41 07-06-2014
OnMyDSeeAtAll



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

Цитата:

Цитата:
...код ни каких проблем с мышью не выявил.
...двойные клики при запущенном скрипте не всегда работают.
Признаюсь, что на прочь забыл про то что использую одиночное нажатие везде (в TC ещё и отдельная опция есть на сей счёт дублирующая ситемную в рамках этого приложения), за сим просто часто забываю сей факт.
Цитата:
...почему знак процента и название таймера в кавычках?
Это как-бы частный случай.
Цитата:
...возвращаем mControl? (куда, почему в скобочках?) и очищаем его значение?

Цитата:
Exit пишет:
Parameters
   ExitCode
      ...can be an expression...
Remarks
   ...Exit is equivalent to Return.
В данном случае ввиду того что команда не только заканчивает данный поток но ещё и способна обработать выражение/я, исходя из эргономики я сокращаю код на 1/2 линию/и. Эквиваленты.

Всего записей: 100 | Зарегистр. 08-07-2011 | Отправлено: 00:07 08-06-2014 | Исправлено: OnMyDSeeAtAll, 00:12 08-06-2014
LonerDergunov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо за пояснения. Взял на заметку, и заодно узнал как элегантно использовать регэкспы.
Благодаря этому скрипт для общего случая (с учётом открытия FTP и дерева каталогов в отдельной панели/панелях) удалось уместить буквально в несколько строк.
Скрипт ))

Всего записей: 2972 | Зарегистр. 11-07-2007 | Отправлено: 04:24 08-06-2014 | Исправлено: LonerDergunov, 04:40 08-06-2014
LonerDergunov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Имеется запись, например такого типа:

Код:
IfWinActive, ahk_class СlassABC, ERROR!
  Выполнить действия
IfWinActive, ahk_class СlassABC, ОШИБКА!
  Выполнить действия

То есть текст в окнах может быть разным (в зависимости от интерфейса программы), Но действия нужно производить одни и те же.
Как можно сократить такую запись?

Всего записей: 2972 | Зарегистр. 11-07-2007 | Отправлено: 05:20 09-06-2014
Krot66



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Проще всего через выражения:
If WinActive("ahk_class ERROR!") Or WinActive("ahk_class ОШИБКА!")

Всего записей: 1201 | Зарегистр. 10-12-2007 | Отправлено: 16:04 09-06-2014 | Исправлено: Krot66, 16:11 09-06-2014
vadim3sh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет.
Помогите пжлст с упрямцем:
RButton & LButton:: Send, #{vk43}
скрипт срабатывает, но после этого левая клавиша начинает работать как весь скрипт. Остановить безобразие можно нажав правую клавишу.

Всего записей: 457 | Зарегистр. 28-01-2006 | Отправлено: 03:37 10-06-2014
LonerDergunov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krot66
Спасибо.
Возник такой вопрос по синтаксису. Если в команде Loop если идёт одна строка - её нужно брать в фигурные скобки или по аналогии с if...else скобки можно опустить?

Код:
Loop, 3
{
    MsgBox, Итерация %A_Index%.
}
 

можно записать как

Код:
Loop, 3
    MsgBox, Итерация %A_Index%.

?

Всего записей: 2972 | Зарегистр. 11-07-2007 | Отправлено: 04:51 12-06-2014 | Исправлено: LonerDergunov, 04:52 12-06-2014
OnMyDSeeAtAll



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krot66 17:04 09-06-2014
До кучи.
vadim3sh 04:37 10-06-2014
Цитата:
...после этого левая клавиша начинает работать как весь скрипт.
Не выявил такого поведения.
LonerDergunov 05:51 12-06-2014
Совершенно верно, можно опустить по аналогии с If.

Всего записей: 100 | Зарегистр. 08-07-2011 | Отправлено: 20:49 12-06-2014 | Исправлено: OnMyDSeeAtAll, 21:01 12-06-2014
LonerDergunov



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

Цитата:
If пишет:

Про If - я понял. Можно ли по аналогии с этим - однострочный Loop тоже писать без кавычек? Или в команде Loop кавычки обязательны?

Всего записей: 2972 | Зарегистр. 11-07-2007 | Отправлено: 21:00 12-06-2014
OnMyDSeeAtAll



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Оперативно(!) Вы отвечаете, поправил свой ответ.

Всего записей: 100 | Зарегистр. 08-07-2011 | Отправлено: 21:02 12-06-2014 | Исправлено: OnMyDSeeAtAll, 21:23 12-06-2014
Krot66



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LonerDergunov
Скобки необходимы при наличии нескольких строк в повторяемом блоке
 
vadim3sh
Если используется альтернативная дополнительная клавиша (через &), надо дополнительно доопределить ее прямое действие
RButton::Send {RButton}
Может понадобиться  
RButton::Send {RButton Up}
 

Всего записей: 1201 | Зарегистр. 10-12-2007 | Отправлено: 14:29 13-06-2014 | Исправлено: Krot66, 14:30 13-06-2014
vadim3sh



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

Цитата:
надо дополнительно доопределить ее прямое действие
RButton::Send {RButton}  

Спасибо, на выходных буду мучить.. Если не секрет, откуда информация? В официалке я, вроде бы, такого не встречал.
 
Krot66
Хм.. И правда, все получилось.. спасибо!!

Всего записей: 457 | Зарегистр. 28-01-2006 | Отправлено: 22:30 14-06-2014 | Исправлено: vadim3sh, 08:05 19-06-2014
Krot66



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Где-то здесь было, но не в основной статье

Всего записей: 1201 | Зарегистр. 10-12-2007 | Отправлено: 17:09 15-06-2014
LonerDergunov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужно задать иконку в трее. Если скрипт компилирован - иконка берётся из скрипта, если нет - то берётся иконка из каталога рядом с ahk-файлом. Как правильно и кратко это записать?
У меня получается что-то такое, но не работает, ошибки в синтаксисе.

Код:
SetWorkingDir %A_ScriptDir%
Menu, Tray, Icon, %A_IsCompiled% ? ( %A_ScriptName%, 1 ) : Icon.ico

 
PS. Усё, дошёл сам до решения.

Код:
Menu, Tray, Icon, % ( (A_IsCompiled = "1") ? (A_ScriptName, 1) : "Icon.ico" )

Всего записей: 2972 | Зарегистр. 11-07-2007 | Отправлено: 05:43 19-06-2014 | Исправлено: LonerDergunov, 18:05 19-06-2014
beome

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Прочитал, что с помощью AutoHotkey можно скрывать/удалять любые элементы окна/программы, это правда?  
 
Возможно ли у окна удалить стандартные Windows Borders и TitleBar, а само окно вписать по указанным координатам? Но чтобы это все делалось при старте программы автоматически.

Всего записей: 21 | Зарегистр. 09-04-2014 | Отправлено: 13:05 19-06-2014
vadim3sh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
beome
TitleBar точно удаляется. Скрипт брал где-то в сети.. Счас сходу не найду..

Всего записей: 457 | Зарегистр. 28-01-2006 | Отправлено: 05:44 22-06-2014
LonerDergunov



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

Код:
if( mControl = TMyPanel1 || mControl = TMyPanel9 || mControl = TMyPanel10 || mControl = TMyPanel8 )

Подскажите, пожалуйста, как упростить? (TMyPanel1, TMyPanel9 и т.д. - это значения переменных)
Пробую вот так, но не работает, выбивает ошибку синтаксиса:

Код:
if( mControl ~= TMyPanel(1|8|9|10) )

Всего записей: 2972 | Зарегистр. 11-07-2007 | Отправлено: 06:09 24-06-2014 | Исправлено: LonerDergunov, 06:27 24-06-2014
OnMyDSeeAtAll



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Наверное так.
Цитата:
...TMyPanel1, TMyPanel9 и т.д. - это значения переменных...
Имелось ввиду значение переменной (mControl)?

Всего записей: 100 | Зарегистр. 08-07-2011 | Отправлено: 19:57 25-06-2014
Открыть новую тему     Написать ответ в эту тему

Страницы: 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