Ru-Board.club
← Вернуться в раздел «Программы»

» AutoHotkey

Автор: oshizelly
Дата сообщения: 17.08.2014 01:45
vadim3sh 01:21 17-08-2014
Цитата:
погуглил тут малеха.. хм.. клавиатурный акселератор - вооще просто горячая клавиша.

Гугл - ф топку Разница в принципах использования клавы в акселератора и в хоткеях просто огромная, и особенно как раз в плане клавиатурных раскладок.
Если интересно, почитайте, например, тут.

У вас текстовый процессор Notepad установлен? Откройте его и нажмите клавишу <LeftAlt> или лучше комбинацию <LeftAlt> + <F>. Видите, там буковки подчёркнуты в названии каждой команды? Вот это и есть клавиатурные акселераторы (keyboard accelerators). Так, нажав последовательно Alt+F => A => E вызываете диалог сохранения файла, а там попадаете в поле выбора выходной кодировки.


Цитата:
А, если не секрет, что за прога?

Так любая же! То, что я указывал команду [Q]uit с акселераторм [Q] - это просто пример. Откройте окно любого приложения (ну, почти любого).
Автор: OnMyDSeeAtAll
Дата сообщения: 18.08.2014 18:51
@oshizelly
[more=Так]
Код: #NoEnv
#KeyHistory
, 0
#SingleInstance,
Ignore
ListLines, Off
IfEqual
, A_IsAdmin, % False, Run, % "*RunAs `"`""A_ScriptFullPath "`"`"",, UseErrorLevel
IfEqual
, A_IsAdmin, % False, ExitApp
ListLines,
On

;~ MButton::SendWindowMessage()
~LAlt::
(
hWndPrev<>hWnd:=WinActive("A")) And (hWndPrev:=hWnd, uId:=CheckUpCharacterCode(hWnd))
, ((
curId:=CheckUpLayout(hWnd))<>uId And uId) And (bState:=True, SendWindowMessage(hWnd, uId))
KeyWait, LAlt
Exit, (
bState) And SendWindowMessage(hWnd, curId), bState:=hWnd:=curId:=A_EndChar

CheckUpCharacterCode(p)
{
If
hMenu:=DllCall("GetMenu", "UPtr", p, "UPtr")
{
DllCall("GetMenuString"(A_IsUnicode ? "W":"A"), "UPtr",
hMenu
, "UInt", 0
, "UPtr", 0*VarSetCapacity(
buf, nMaxCount
:=DllCall("GetMenuString"(A_IsUnicode ? "W":"A"), "UPtr", hMenu
, "UInt", 0
, "UPtr", 0
, "Int", 0
, "UInt", 0x00000400
; MF_BYPOSITION
, "Int")
*(
A_IsUnicode ? 2:1)+1, 0)|&
buf
, "Int", nMaxCount
, "UInt", 0x00000400)
charNumber:=Asc(RegExReplace(StrGet(&buf), ".*&([A-zА-я]).*", "$1"))
If
charNumber Between 65 And 122
Return, 0x04090409
Else If
charNumber Between 1040 And 1103
Return, 0x04190419
}
Return, 0x00000000
}

CheckUpLayout(p)
{
Return, DllCall("GetKeyboardLayout", "UInt", DllCall("GetWindowThreadProcessId", "UPtr",
p
, "UInt*", 0
, "UInt")
, "UPtr")
}

SendWindowMessage(p1:=0, p2:=0)
{
DllCall("SendMessage"(A_IsUnicode ? "W":"A"), "UPtr",
p1 ? p1:WinActive("A")
, "UInt", 0x0050
; WM_INPUTLANGCHANGEREQUEST
, "Ptr", p2 ? 0:0x0002 ; INPUTLANGCHANGE_FORWARD
, "Ptr", p2 ? p2:0)
}
Автор: oshizelly
Дата сообщения: 19.08.2014 00:22
OnMyDSeeAtAll 18:51 18-08-2014
Цитата:
Так [?] Вам подойдёт?

Спасибо, но у меня этот скрипт работает так же, как гораздо более простой вот этот скрипт.
То есть, нажатие одиночного Alt просто переключает раскладку на другую, но не временно, а постоянно.
А если жать Alt одновременно с буквой, и при этом текущей раскладкой является русская, а меню - английское, то вообще ничего не происходит, как если бы этого скрипта и не было

А у вас этот скрипт работает правильно?
Автор: vadim3sh
Дата сообщения: 19.08.2014 18:03
Buuu... РРРРРРРРРРРРРРРРР..
Была тупая идея по поводу задачи oshizelly
типа:

Код: $!vk46:: !f
Автор: OnMyDSeeAtAll
Дата сообщения: 20.08.2014 03:33
oshizelly 01:22 19-08-2014
Цитата:
...нажатие одиночного Alt просто переключает раскладку на другую, но не временно, а постоянно.
По [more=логике]Скрипт переключает раскладку (в том случае если она не совпадает) на тот язык который он определяет (при первом использовании горячей клавиши в окне активного приложения) по характеру акселератора получаемого из меню, при отпускании этой горячей клавиши он возвращает раскладку (в том случае если она была переключена) на ту которая на данный момент была активна.

Если активное окно не содержит меню, либо имеет не стандартное меню, горячая клавиша не имеет функциональной нагрузки.[/more] моего кода использование одиночного нажатия не предусмотрено (хотя и возможно), но если такое и происходит, такого явления не было замечено.
Цитата:
Q.1: ...если жать Alt одновременно с буквой, и при этом текущей раскладкой является русская, а меню - английское, то вообще ничего не происходит...
Q.2: ...у вас этот скрипт работает правильно?
A.1: По логике делаете правильно, и тут как вариант может быть такая ситуация: скрипт и приложение имеуют разные уровни прав (если проложение запущено от имени администратора, а скрипт нет, то он не будет работь в этом приложении). Добавил в код условие, чтобы скрипт запускался с правом администратора.
A.2: У меня данный код работает без нареканий в: блокноте, редакторе SciTE-Ru, калькуляторе, Audacity, VirtualDubMod (дальше проверять не стал). Согласно замечанию (GetMenu()) в окнах с не стандартным меню, плавающих окнах либо где меню вообще нет - код работать не будет, таким образом у меня не работает в: Total Commander, Photoshop, 3ds Max, Chrome, Opera (далее не смотрел).
@vadim3sh
Если я правильно [more=понял]
Код: Alt & CapsLock::SetCapsLockState, Off
Автор: vadim3sh
Дата сообщения: 20.08.2014 17:18
OnMyDSeeAtAll

Цитата:
Если я правильно
Правильно, правильно! Спасибо опять и снова большое! Еслиб еще первую часть вопроса кто-то просветил..

oshizelly
глянте на костыль пока... может, что-то измените уже по месту..

Код: CapsLock::
PostMessage, 0x50, 2,,, A
KeyWait, CapsLock
PostMessage, 0x50, 2,,, A
Return
Alt & CapsLock::SetCapsLockState, Off
return
Автор: oshizelly
Дата сообщения: 23.08.2014 14:01
vadim3sh 17:18 20-08-2014
Цитата:
глянте на костыль пока... может, что-то измените уже по месту.. У меня работает. Вродебы как.

Огромное спасибо (а также и OnMyDSeeAtAll за идейную поддержку), жить стало легче и, конечно же, веселей. Поначалу нажимал по привычке первой клавишу <Alt>, потом уже <Capslock> - и оно, естественно, не работало. Только потом сообразил (вернее, прочёл более внимательно), что сначала надо зажимать именно <Capslock>, а потом уже <Alt> с буквой-акселератором.

Кроме исходной задачи (вызов команд английского меню при текущей русской раскладке) имеем также очень полезную дополнительную фичу. Можно, зажав CapsLock, но не переключая раскладку полностью, ввести несколько символов на альтернативной раскладке: при активной русской раскладке ввести пару символов английских символов (или наоборот, хотя обычно этого не требуется). Вроде как ввод нескольких заглавных букв с зажатым шифтом. Ну просто очень удобно! :hands: (Эта фича, кстати, тоже была в старинном Keyboard Ninja)

Тем не менее, остаётся пара проблем.

1) У меня оно работает для вызова команд главного меню, но почему-то не работает для навигации внутри модальных окон диалогов, как я описывал несколькими постами выше. А у вас? Может, я что-то не так делаю?

2) При обычном вводе текста с зажатым <Capslock> можно нажать дополнительно клавишу <Shift> - и тогда буквы из альтернативной раскладки будут вводиться заглавными (что очень хорошо и логично). Однако почему-то нажатие клавиши <Shift> не воздействует на некоторые клавиши. А ещё, с зажатым шифтом вообще не удаётся ввести некоторые буквы, например, букву <S>/<Ы> - ни строчную, ни заглавную (возможно, есть и ещё такие буквы, все не проверял).
То же самое с клавишей, расположенной в предпоследнем ряду между левым шифтом и клавишей <Z> (она не на всех клавиатурах присутствует): одиночный Capslock воздействует на неё вполне правильно, то есть, вводится символ нижнего регистра из альтернативной раскладки, но с нажатой клавишей <Shift> ничего не вводится вообще. (А это, кстати, очень нужная клавиша, так как, например, в немецкой и скандинавской раскладке именно эта клавиша с шифтом вводит правую треугольную скобку >, а на русской раскладке - не менее нужный косой слэш /.
Автор: oshizelly
Дата сообщения: 23.08.2014 16:30
А ещё временное переключение раскладок по <Capslock> почему-то не работает в некоторых окнах текстового ввода некоторых приложений, например, в приложении HyperSnap при вписывании текста в textbox, в приложении QTranslate.

Автор: vadim3sh
Дата сообщения: 24.08.2014 00:30
oshizelly
Догадываюсь, что сча буду бит OnMyDSeeAtAll, но PostMessage у меня почему-то часто барахлит.. Поэтому сам я использую еще один костыль.. Попробуйте, мож помож..
Зайдите в языковые настройки и там проверьте, чтобы циклич перекл раскладки было на алт+шифт. Можно и на контрл+щифт, но надо скрипт корректировать. А потом потестите такую кракозяблу:

Код: CapsLock::
Send {Shift Down} {Alt} {Shift Up}
KeyWait, CapsLock
Send {Shift Down} {Alt} {Shift Up}
Return
Alt & CapsLock::SetCapsLockState, Off
return
Автор: oshizelly
Дата сообщения: 24.08.2014 12:35
vadim3sh 00:30 24-08-2014
Цитата:
Поэтому сам я использую еще один костыль.. Попробуйте, мож помож.

Попробовал последний вариант - и просто офигел. После загрузки этого скрипта одиночное нажатие на клавишу Capslock в дополнение к временной смене текущей раскладки клавиатуры также генерирует нажатие на Alt+Space => Tab (пробовал в Notepad, Opera и ещё парочке приложений). То есть, вызывается системное меню текущего окна (то самое, что обычно вызывается нажатием комбинации клавиш Alt+Space либо правым кликом по заголовку окна) и кроме того, если фокус находится в поле ввода (например, в главном окне Notepad), то вставляется табулятор.

Хотя ведь даже для меня очевидно, что в этих 7 строчках кода ничего подобного нет. Возможно, образуется какой-то совокупный эффект с моими системными настройками (см приложенный скриншот - переключение клавиатур по LeftAlt+Shft+0 и LeftAlt+Shft+1), но совершенно не представляю, как и почему это могло бы происходить.


Цитата:
Зайдите в языковые настройки и там проверьте, чтобы циклич перекл раскладки было на алт+шифт.

Именно так оно у меня и настроено (см скриншот).





Цитата:
По поводу второй части вопроса (про   шифт) - они явно косячат из-за того, что в винде shift+capslock=capslock.

Не совсем точно. Теоретически, можно настроить так, чтобы было shift+capslock=!capslock, то есть,
чтобы нажатие <Shift>+<CapsLock> отключало уже включённый режим CapsLock (хотя дефолтная настройка Windows' другая: отключение режима CapsLock самой же клавишей <CapsLock> (см скриншот).) На самом деле это работает немного иначе: независимо от того, какой вариант выбрать в этом диалоге настроек, комбинация клавиш <Shift>+<CapsLock> работает на включение/отключение режима CapsLock. (по крайней мере, у меня так).

Однако в любом случае ваша гипотеза никак не объясняет, почему при нажатой клавише <Shift> из всего множества буквенно-цифровых клавиш некорректно обрабатывается только нажатие на некоторые (например, <S>/<Ы> и клавиша между левым шифтом и <Z>).

И ещё один момент. При запущенном скрипте если сначала зажать клавишу <Shift>, а потом уже нажимать <CapsLock>, то как раз и происходит включение/отключение режима <CapsLock> - и это вполне ожидаемо. А вот когда нажимаешь эти клавиши в обратном порядке (сначала зажать клавишу <CapsLock>, а потом уже нажимать <Shift>), то как раз и срабатывает ваш скрипт - опять же вполне ожидаемо. Но почему-то не для всех клавиш. И если неправильная обработка нажатия клавиши, расположенной между левым шифтом и <Z>, можно хоть как-то объяснить спецификой этой клавиши, то клавиша <S>/<Ы> - полная загадка природы.




Да, и вы так и не ответили про предыдущую версию скрипта, работает ли она у вас для навигации внутри модальных окон диалогов.
Автор: vadim3sh
Дата сообщения: 25.08.2014 03:52
oshizelly

Цитата:
также генерирует нажатие на Alt+Space

гии.. у меня тоже. Ну тут надо OnMyDSeeAtAll звать.. Не моя весовая категория. "Сам использую" - имелось в виду замена PostMessage на Send.
Насчет
Цитата:
навигации внутри модальных окон диалогов
, если [more=это]Модальное диалоговое окно должно быть всплывающим окном, имеющим системное меню, область заголовка и толстую рамку; то есть шаблон диалогового окна должен задать стили WS_POPUP, WS_SYSMENU, WS_CAPTION и DS_MODALFRAME. Хотя приложение может определять стиль WS_VISIBLE, система всегда показывает на экране модальное диалоговое окно независимо от того, задается или нет стиль диалогового окна WS_VISIBLE. Приложение не должно создавать модальное диалоговое окно, имеющее стиль WS_CHILD. Модальное диалоговое окно с этим стилем блокирует себя, препятствуя любому последующему вводу данных из действующего приложения.

Приложение создает модальное диалоговое окно, используя либо функцию DialogBox, либо DialogBoxIndirect. DialogBox требует имени или идентификатора ресурса, содержащего шаблон диалогового окна; DialogBoxIndirect требует дескриптора объекта памяти, содержащего шаблон диалогового окна. Функции DialogBoxParam и DialogBoxIndirectParam также создают модальные диалоговые окна; они идентичны выше упомянутым функциям, но, когда диалоговое окно создается, то передают заданный параметр в процедуру диалогового окна.[/more]они, то я ни оч понявши...
Может, если не трудно, на пальцах? Я потом честно проверю.. Хотя через PostMessage наверняка будет глючить..
P.S. Я сейчас не на своем компутере.. Если не лень, попробуйте так, пробел не уйдет?

Код: CapsLock::
Send {Shift Down}{Alt}{Shift Up}
KeyWait, CapsLock
Send {Shift Down}{Alt}{Shift Up}
Return
Alt & CapsLock::SetCapsLockState, Off
return
Автор: oshizelly
Дата сообщения: 25.08.2014 12:44
vadim3sh 03:52 25-08-2014
Цитата:

Цитата: навигации внутри модальных окон диалогов

если это [?]они, то я ни оч понявши.. . Может, если не трудно, на пальцах? Я потом честно проверю..
Автор: vadim3sh
Дата сообщения: 26.08.2014 01:58
oshizelly
1. В модальных окнах (firefox, akelpad) работает, notepad - нет
2. Пробел, кстати, ушел
3. Не работает еще кое-где: напр. ... черт, потерял в какой программе не сработал.. короче, после Alt+F (меню файл) в этом меню один из пунктов срабатывать отказался.
Автор: oshizelly
Дата сообщения: 26.08.2014 09:46
vadim3sh 01:58 26-08-2014
Цитата:
1. В модальных окнах (firefox, akelpad) работает, notepad - нет

Mozilla FireFox - совсем неудачный пример. Это кроссплатформенный мутант, который в Windows' работает совсем не так, как подавляющее большинство "нормальных" приложений. О чём тут говорить, если в окнах FF под Windows' часто не работает нормально (или вообще не работает) даже разнообразный софт для захвата изображения с экрана Почему так происходит - никто до сих внятно не объяснил, хотя выдвинули мильон разных версий, но сам факт этой специфики общеизвестен.

Про Akelpad не скажу, но, возможно, там то же самое.

Поэтому я предпочитаю проверять работоспособность любых универсальных решений под Windows' именно на Notepad, которым в реальной жизни почти никогда не пользуюсь. Если сработало в Notepad, то, скорее всего, сработает и в большинстве "нормальных" приложений.

Автор: nibble74
Дата сообщения: 20.09.2014 00:07
Ребята, приветствую ! помогите скрип написать, сам не могу, не имею глубоких познаний в этом.

Вообщем такой, висит в трее и ждёт процесса, как запустился нужный процесс "имя.exe" запускаются однократно клавиши "Ctrl+Alt+h" - после завершения процесса "имя.exe" снова запустились однократно "Ctrl+Alt+h" и скрип в ожидании.

Помогите плиз, голова уже пухнет от экспериментов, нужен наглядный пример.
Автор: Krot66
Дата сообщения: 20.09.2014 12:55
start:
Process wait, имя.exe
Посылка клавиш
Process WaitClose, имя.exe
Посылка клавиш
goto start

Специи, задержки и ограничение времени ожидания по вкусу
Автор: nibble74
Дата сообщения: 20.09.2014 14:20
Krot66

Вот спасибо, оказалось всё просто и легко )
Автор: vadim3sh
Дата сообщения: 21.09.2014 19:00
Krot66
И от меня спасибки.
Люди, подскажите, плз, кто в курсе: вот "start:" - это метка (вроде как )
Метки используются в достаточно большом количестве случаев. Но в справке как-то про них отдельно не пишут..
Ну, например: записывается именно так (start: ), с двоеточием. А откуда это известно? Может, я просто нужный раздел не нашел? Тогда, если не трудно, тыкните носом.

Автор: OnMyDSeeAtAll
Дата сообщения: 22.09.2014 19:34
vadim3sh 20:00 21-09-2014
Цитата:
Может, я просто нужный раздел не нашел?
По-видимому.
Автор: vadim3sh
Дата сообщения: 23.09.2014 04:23
OnMyDSeeAtAll
Fu...k! И раздел, и весь сайт! А ведь говорили великие люди дуракам: "читайте первоисточники"!
Спасибо !
Автор: thejustsoul
Дата сообщения: 30.09.2014 21:04
Посоветуйте самый нормальный "создатель макросов" под AHK, находил несколько, но чет они корявые какие-то.
Приглянулся этот, X-Macro Recorder v2.0.2 (XMR2.0.2.ahk) (тут зеркало), но у него есть минус, он не видит русские буквы.

Если записывать например порядок: открыть блокнот, написать по-английски, поменять раскладку, написать по-русски, потом все это воспроизвести, и в итоге обе строки будут на английском -(

Подскажите пожалуйста, как добавить поддержку кириллицы в этот рекордер?

Если что, код этого рекордера:
[more]

Код:
KeyList :=
(Join
"Browser_Back|Browser_Forward|Browser_Refresh|Browser_Stop|Browser_Search|Browser_Favorites|Browser_Home|Volume_Mute|Volume_Down|Volume_Up|Media_Next|Media_Prev|Media_Stop|Media_Play_Pause|Launch_Mail|Launch_Media|Launch_App1|Launch_App2|
Esc|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12|PrintScreen|Pause|Ins|Del|
``|1|2|3|4|5|6|7|8|9|0|-|=|Backspace|Home|
Tab|q|w|e|r|t|y|u|i|o|p|[|]|\|PgUp|
a|s|d|f|g|h|j|k|l|;|'|Enter|PgDn|
z|x|c|v|b|n|m|,|.|/|End|
Space|AppsKey|
ScrollLock|CapsLock|NumLock|
Up|Down|Left|Right|
Numpad0|NumpadIns|
Numpad1|NumpadEnd|
Numpad2|NumpadDown|
Numpad3|NumpadPgDn|
Numpad4|NumpadLeft|
Numpad5|NumpadClear|
Numpad6|NumpadRight|
Numpad7|NumpadHome|
Numpad8|NumpadUp|
Numpad9|NumpadPgUp|
NumpadDot|NumpadDel|
NumpadDiv|NumpadMult|
NumpadAdd|NumpadSub|
NumpadEnter|
WheelUp|WheelDown|
LControl|RControl|LShift|RShift|LAlt|RAlt|LWin|RWin"
)
ListControlMove := "Group1|XPos|UD1|YPos|UD2|GetPos"
ListControlClick := ListControlMove "|Group2|ButtonClick|Group3|StateClick|CurrentClick"
ListControlKey := "Group4|Group5|Group6|SendKey|SendString|KeyName|KeyState|StringText"
ListControlWin := "Group1|XPos|UD1|YPos|UD2|GetWin|Group7|WidthSize|UD3|HeightSize|UD4|Group8|WinTitle|Group9|WinClass"
ListControlDelay := "Group10|Delayms|UD5"
SetBatchLines,-1
CoordMode,Mouse,Screen
SetMouseDelay,-1
SetWinDelay, 0
DetectHiddenWindows, On
SetControlDelay, -1
#MaxThreadsBuffer On
#InstallMouseHook
#MaxHotkeysPerInterval 999999999
#HotkeyInterval 9999999999
SendMode,Event
SetKeyDelay, -1
Send {Shift}
TitleName := "XMR v2.1 by ___x@___"
Menu,Tray,Add,Start/Stop Recording,Record
Menu,Tray,Add,Start/Stop Play Record,PlayRecord
Menu,Tray,Add,Exit,GuiClose
Menu,Tray,Nostandard
Menu,Tray,Default,Start/Stop Recording
Menu,Tray,Click,1
Gui, Add, ListView, x202 y70 w500 h280 Grid +NoSortHdr, Command|Information
Gui, Add, GroupBox, x12 y0 w180 h70 , Settings
Gui, Add, Checkbox, x32 y160 w140 h30 +Checked vWinInfo gWinInfo, Window Titles && Classes
Gui, Add, Checkbox, x52 y190 w60 h20 vWPos, Positions
Gui, Add, Checkbox, x122 y190 w50 h20 vWSize, Sizes
Gui, Add, Checkbox, x32 y230 w130 h20 +Checked vMouseMovemnets, Mouse Movements
Gui, Add, Checkbox, x32 y210 w130 h20 +Checked vClicks, Mouse Clicks
Gui, Add, Checkbox, x32 y250 w130 h20 +Checked vKeyboardActions, Keyboard Actions
Gui, Add, Checkbox, x32 y270 w90 h20 +Checked vDelayTime gDelayTime, Time Intervals
Gui, Add, Edit, x132 y270 w52 h20 +number vDefaultDelay +Disabled, 50
Gui, Add, UpDown, x152 y270 w18 h20 , 50
Gui, Add, GroupBox, x12 y140 w180 h160 , Record options
Gui, Add, Text, x22 y20 w60 h20 , CoordMode
Gui, Add, Text, x22 y40 w60 h20 , BlockInput
Gui, Add, DropDownList, x82 y20 w90 h21 +R7 vCoordType, Screen||Window
Gui, Add, DropDownList, x82 y40 w90 h21 +R7 vBlockInputType, On|Off|MouseMove||
Gui, Add, GroupBox, x12 y70 w180 h70 , Hotkeys
Gui, Add, Text, x22 y90 w30 h20 , Rec
Gui, Add, Text, x22 y110 w30 h20 , Play
Gui, Add, DropDownList, x52 y90 w100 h20 vRecordKey +R7 gSaveHotKey, F1|F2|F3|F4|F5|F6|F7||F8|F9|F10|F11|F12
Gui, Add, DropDownList, x52 y110 w100 h20 vPlayKey +R7 gSaveHotKey, F1|F2|F3|F4|F5|F6|F7|F8||F9|F10|F11|F12
Gui, Add, GroupBox, x202 y0 w500 h60 , Control
Gui, Add, Button, x222 y20 w70 h30 gRecord, Record
Gui, Add, Button, x292 y20 w70 h30 gPlayRecord, Play
Gui, Add, Button, x402 y20 w70 h30 , nothing
Gui, Add, Button, x472 y20 w70 h30 gAHKSave, >>AHK
Gui, Add, Button, x542 y20 w70 h30 gSave, >>XMR
Gui, Add, Button, x612 y20 w70 h30 gLoad, Load...
Gui, Add, GroupBox, x12 y300 w180 h50 , Play Options
Gui, Add, Edit, x82 y320 w104 h20 vRepeatTime +number,
Gui, Add, Updown, x164 y320 w18 h20 Range0-999999999, 0
Gui, Add, Text, x22 y320 w60 h20 , Repeat
Gui, Add, Button, x722 y20 w70 h30 gInsertInfo, Insert
Gui, Add, Button, x792 y20 w70 h30 gDelInfo, Delete
Gui, Add, Button, x862 y20 w70 h30 gDelAll, Delete All
Gui, Add, DropDownList, x752 y90 w140 h21 +R7 gCommandMode vCommandMode, Move Mouse||Click|KeyBoard|Window|Delay
Gui, Add, GroupBox, x712 y60 w230 h290 , Command
Gui, Add, GroupBox, x712 y120 w230 h50 vGroup1, Position (X - Y)
Gui, Add, Edit, x722 y140 w90 h20 vXPos, x
Gui, Add, Updown, x164 y320 w18 h20 Range0-999999999 vUD1, 0
Gui, Add, Edit, x812 y140 w90 h20 vYPos, y
Gui, Add, Updown, x164 y320 w18 h20 Range0-999999999 vUD2, 0
Gui, Add, Text, x910 y140 w20 h20 +Center cRed vGetPos gGetPos, <<
Gui, Add, GroupBox, x712 y210 w130 h50 vGroup2, Button
Gui, Add, DropDownList, x722 y230 w110 h21 +R7 vButtonClick, Left||Right|Middle
Gui, Add, GroupBox, x842 y210 w100 h50 vGroup3, State
Gui, Add, DropDownList, x852 y230 w80 h21 +R7 vStateClick, Normal||Up|Down
Gui, Add, CheckBox, x722 y180 w200 h20 vCurrentClick gCurrentClick, Click at Current Position
Gui, Add, GroupBox, x712 y120 w130 h50 vGroup4,
Gui, Add, GroupBox, x842 y120 w100 h50 vGroup5, State
Gui, Add, GroupBox, x712 y180 w230 h110 vGroup6,
Gui, Add, Radio, x722 y120 h20 vSendKey +Checked gKeyRadio, Key
Gui, Add, Radio, x722 y180 h20 vSendString gKeyRadio, String
Gui, Add, DropDownList, x722 y140 w110 h21 +R7 vKeyName +Choose1, % KeyList
Gui, Add, DropDownList, x852 y140 w70 h21 +R7 vKeyState, Normal||Up|Down
Gui, Add, Edit, x722 y210 w210 h70 vStringText +Disabled, ___x@____
Gui, Add, Text, x902 y90 w30 h20 vGetWin gGetWin cRed, >><<
Gui, Add, GroupBox, x712 y170 w230 h50 vGroup7, Size (W - H)
Gui, Add, Edit, x722 y190 w90 h20 vWidthSize +number,
Gui, Add, Updown, x164 y320 w18 h20 Range0-999999999 vUD3,
Gui, Add, Edit, x812 y190 w90 h20 vHeightSize +number,
Gui, Add, Updown, x164 y320 w18 h20 Range0-999999999 vUD4,
Gui, Add, GroupBox, x712 y220 w230 h50 vGroup8, Title
Gui, Add, Edit, x722 y240 w180 h20 vWinTitle,
Gui, Add, GroupBox, x712 y270 w230 h50 vGroup9, Class
Gui, Add, Edit, x722 y290 w180 h20 vWinClass,
Gui, Add, GroupBox, x712 y120 w230 h50 vGroup10, Delay (ms)
Gui, Add, Edit, x732 y140 w168 h20 vDelayms +number, DelayTime
Gui, Add, Updown, x164 y320 w18 h20 Range1-999999999 vUD5, 1
Gui, Add, GroupBox, x712 y0 w230 h60 , Edit
Gui, Show, x213 y159 h363 w961, %TitleName%
gosub, CommandMode
gosub,SaveHotkey
OnExit,IsSave
Return
DelAll:
LV_Delete()
XMR_Data := ""
return
IsSave:
Gui +OwnDialogs
if LV_GetCount()
{
    MsgBox,35,Save?,Do you want to save before exiting?
    IfMsgBox,Cancel
        return
    IfMsgBox,Yes
        gosub,Save
}
ExitApp
return
AHKSave:
Gui +OwnDialogs
if !XMR_Data
    return
FileSelectFile,IniFile,S,% root,Save as AHK file - %TitleName%,AHK (*.ahk)
if !IniFile
    Return
SplitPath,IniFile,,root,ext
if (ext<>"ahk")
    IniFile .= ".ahk"
TempVar :=
(
";~ ###Settings###
SetBatchLines,-1
CoordMode,Mouse,Screen
SetMouseDelay,-1
SetWinDelay, 0
DetectHiddenWindows, On
SetControlDelay, -1
#MaxThreadsBuffer On
SendMode, Input
SetKeyDelay, -1
"
)
TempVar .= XMR2AHK(XMR_Data,CoordType,BlockInputType) "`nExitApp"
IfExist,% IniFile
    FileDelete,% IniFile
FileAppend,% TempVar,% IniFile,UTF-8
return
DelInfo:
Loop,% LV_GetCount("S")
{
    DelInfo(LV_GetNext())
    LV_Delete(LV_GetNext())
}
return
InsertInfo:
Gui,Submit,Nohide
SelectedRow := ( (SelectedRow := LV_GetNext()) ? SelectedRow : LV_GetCount())
if (CommandMode = "Move Mouse")
{
    if (XPos="" OR YPos="")
        return
    InsertInfo("M" Chr(252) XPos Chr(251) YPos,SelectedRow)
    DisplayInfo("M",XPos Chr(251) YPos,SelectedRow)
}
else if (CommandMode = "Click")
{
    if (XPos="" && YPos<>"") OR (XPos<>"" && YPos="")
        return
    InsertInfo("C" Chr(252) SubStr(ButtonClick,1,1) Chr(251) XPos Chr(251) YPos Chr(251) (StateClick="normal" ? "" : SubStr(StateClick,1,1)),SelectedRow)
    DisplayInfo("C",SubStr(ButtonClick,1,1) Chr(251) XPos Chr(251) YPos Chr(251) (StateClick="normal" ? "" : SubStr(StateClick,1,1)),SelectedRow)
}
if (CommandMode="Window")
{
    if (!WinClass && !WinTitle) OR (XPos="" && YPos<>"") OR (XPos<>"" && YPos="") OR (WidthSize="" && HeightSize<>"") OR (WidthSize<>"" && HeightSize="")
        return
    InsertInfo("W" Chr(252) XPos Chr(251) YPos Chr(251) WidthSize Chr(251) HeightSize Chr(251) WinClass Chr(251) WinTitle,SelectedRow)
    DisplayInfo("W",XPos Chr(251) YPos Chr(251) WidthSize Chr(251) HeightSize Chr(251) WinClass Chr(251) WinTitle,SelectedRow)
}
else if (CommandMode="KeyBoard")
{
    TempVar := ""
    if (SendKey=1)
        TempVar := KeyName . (KeyState<>"Normal" ? " " KeyState : "")
    else Loop,Parse,StringText
    if (A_LoopField="`n")
        TempVar .= "{Enter}"
    else if (A_LoopField=" ")
        TempVar .= "{Space}"
    else TempVar .= "{" A_LoopField "}"
    if !(SendKey=1)
        TempVar := SubStr(TempVar,2,StrLen(TempVar)-2)
    If (Tempvar = "")
        return
    InsertInfo("K" Chr(252) TempVar,SelectedRow)
    DisplayInfo("K",TempVar,SelectedRow)
}
else if (CommandMode="Delay")
{
    if !Delayms
        return
    InsertInfo("D" Chr(252) Delayms,SelectedRow)
    DisplayInfo("D",Delayms,SelectedRow)
}
LV_ModifyCol(1,"AutoHdr")
LV_ModifyCol(2,"AutoHdr")
return
CurrentClick:
GuiControlGet,CurrentClick,,CurrentClick
if CurrentClick
{
    GuiControl,,XPos,
    GuiControl,,YPos,
    ControlDisableEnable("XPos|YPos|GetPos","")
}
else
ControlDisableEnable("","XPos|YPos|GetPos")
return
KeyRadio:
GuiControlGet,SendKey,,SendKey
if (SendKey=1)
    ControlDisableEnable("StringText","KeyName|KeyState")
else ControlDisableEnable("KeyName|KeyState","StringText")
return
GetWin:
Gui,Hide
while (GetKeyState("LButton","P")) {
    MouseGetPos,,,WinID
    WinGetPos,XPos,YPos,WidthSize,HeightSize,ahk_id %WinID%
    WinGetTitle,WinTitle,ahk_id %WinID%
    WinGetClass,WinClass, ahk_id %WinID%
    ToolTip,% "X=" XPos "`nY=" YPos "`nW=" WidthSize "`nH=" HeightSize "`nTitle=" WinTitle "`nClass=" WinClass
    Sleep 100
}
ToolTip
GuiControl,,XPos,% XPos
GuiControl,,YPos,% YPos
GuiControl,,WidthSize,% WidthSize
GuiControl,,HeightSize,% HeightSize
GuiControl,,WinClass,% WinClass
GuiControl,,WinTitle,% WinTitle
Gui,Show
return
GetPos:
Gui,Hide
GuiControlGet,CoordType,,CoordType
CoordMode,Mouse,% CoordType
while (GetKeyState("LButton","P")) {
    MouseGetPos,XPos,YPos
    ToolTip,% "X=" XPos "`nY=" YPos
}
ToolTip
GuiControl,,XPos,% XPos
GuiControl,,YPos,% YPos
Gui,Show
return
Record:
if PlayRecordFlag
    return
if (RecordFlag := !RecordFlag) {
while (GetKeyState(A_ThisHotkey,"P"))
    Sleep 1
SetTimer,StartRecording,-1
}
else
    SetTimer,StopRecording,-1
return
StartRecording:
WindowInfoRecord(1)
Gui, Submit
TrayTip,%TitleName%,% "Recording...`nPress " RecordKey " to Stop",15000
TempVar := XMR((StopRecordingFlag:=0),CoordType )
XMF(TempVar,WinInfo,WinInfo,WPos,WSize,MouseMovemnets,Clicks,KeyboardActions,DelayTime,DefaultDelay)
XMR_Data := Trim(XMR_Data "`n" TempVar,"`n")
ShowInfo:
LV_Delete()
Loop,Parse,XMR_Data,`n
{
    StringSplit,Info,A_LoopField,% Chr(252)
    DisplayInfo(Info1,Info2)
}
LV_ModifyCol(1,"AutoHdr")
LV_ModifyCol(2,"AutoHdr")
Gui, Show
return
StopRecording:
Critical
StopRecordingFlag := 1
return
PlayRecord:
if RecordFlag
{
    gosub, Record
    return
}
Gui,Submit
if (PlayRecordFlag := !PlayRecordFlag)
    SetTimer,StartPlaying,-10
else SetTimer,StopPlaying,-1
return
StartPlaying:
StopXMPFlag := 0
while (!StopXMPFlag && RepeatTime>=0)
{
    XMP(StopXMPFlag,XMR_Data,CoordType,BlockInputType)
    RepeatTime--
}
PlayRecordFlag := 0
Gui,Show
return
StopPlaying:
Critical
StopXMPFlag := 1
return
CommandMode:
GuiControlGet,CommandMode,,CommandMode
if (CommandMode_Old = CommandMode)
    return
ControlHideShow(ListControlClick "|" ListControlWin "|" ListControlKey "|" ListControlDelay)
if (CommandMode = "Move Mouse")
    ControlHideShow("",ListControlMove)
else if (CommandMode = "Click")
    ControlHideShow("",ListControlClick)
if (CommandMode="Window")
    ControlHideShow("",ListControlWin)
else if (CommandMode="KeyBoard")
    ControlHideShow("",ListControlKey)
else if (CommandMode="Delay")
    ControlHideShow("",ListControlDelay)
CommandMode_Old := CommandMode
return
About:
MsgBox, 0, %TitleName%, Author : ___x@___ (nothing)`nEmail: anhnhoktvn@gmail.com`nFeedbacks are welcome!`n`nCredits:`nAutohotkey by Chris `nAutohotkey_L by Lexikos`nAhk2Exe by fincs
return
DelayTime:
GuiControlGet,DelayTime,,DelayTime
GuiControl,Disable%DelayTime%,DefaultDelay
return
WinInfo:
GuiControlGet,WinInfo,,WinInfo
    GuiControl,Enable%WinInfo%,WPos
    GuiControl,Enable%WinInfo%,WSize
    GuiControl,,WPos,%WinInfo%
    GuiControl,,WSize,%WinInfo%
return
SaveHotkey:
GuiControlGet,RecordKey,,RecordKey
GuiControlGet,PlayKey,,PlayKey
if (RecordKey=PlayKey)
{
    MsgBox,48,ERROR,Please choose another hotkey!
    GuiControl,ChooseString,RecordKey,% RecordKey_Old
    GuiControl,ChooseString,PlayKey,% PlayKey_Old
    return
}
Hotkey, %RecordKey_Old%, Record, Off UseErrorLevel
Hotkey, %RecordKey%, Record, On UseErrorLevel
RecordKey_Old := RecordKey
Hotkey, %PlayKey_Old%, PlayRecord, Off UseErrorLevel
Hotkey, %PlayKey%, PlayRecord, On UseErrorLevel
PlayKey_Old:=PlayKey
TrayTip,% TitleName,% "Press " RecordKey " to Start Recording`nPress " PlayKey " to Start Playing Record",15000,1
return
GuiClose:
ExitApp
return
Save:
Gui +OwnDialogs
if !LV_GetCount()
{
    MsgBox,48, %TitleName%, Nothing to Save!
    return
}
FileSelectFile,IniFile,S,%root%,Save data - %TitleName%,X-Macro Recorder (*.xmr)
if !IniFile
    Return
SplitPath,IniFile,,root,ext
if (ext<>"xmr")
    IniFile .= ".xmr"
IfExist, % IniFile
{
    MsgBox, 36, %TitleName%, %IniFile% already exists.`nDo you want to replace it?
        IfMsgBox,No
            return
}
FileDelete, %IniFile%
TrayTip,%TitleName% ,Saving Data!`nPlease Wait..., 15000
IniWrite,% CoordType,% IniFile,CoordMode
IniWrite,% BlockInputType,% IniFile,BlockInput
IniWrite,% XMR_Data,% IniFile,Data
TrayTip,%TitleName% ,Saved!, 5000
return
Load:
Gui +OwnDialogs
FileSelectFile,IniFile,,%root%,Load data - %TitleName%,X-Macro Recorder (*.xmr)
if !IniFile
    Return
SplitPath,IniFile,,root,ext
if (ext<>"xmr")
    return
IniRead,TempVar,% IniFile, CoordMode
GuiControlGet,CoordType,,CoordType
if (TempVar<>CoordType)
{
    if LV_GetCount() {
    Gui +OwnDialogs
    MsgBox,48,ERROR,Different CoordMode!
    return
    }
    else GuiControl,Choose,CoordType,2
}
GuiControl,,CoordType,% TempVar
IniRead,BlockInputType,% IniFile, BlockInput
GuiControl,,BlockInputType,BlockInputType
IniRead,TempVar,% IniFile,Data
StringReplace,TempVar,TempVar,`r`n,`n,All
XMR_Data := Trim(XMR_Data "`n" TempVar,"`n")
gosub,ShowInfo
return
ControlDisableEnable(DisableList="",EnableList="")
{
    if DisableList
        Loop, Parse, DisableList,|
            GuiControl,Disable,% A_LoopField
    if EnableList
        Loop, Parse, EnableList,|
            GuiControl,Enable,% A_LoopField
}
ControlHideShow(HideList="",ShowList="")
{
    if HideList
        Loop, Parse, HideList,|
            GuiControl,Hide,% A_LoopField
    if ShowList
        Loop, Parse, ShowList,|
            GuiControl,Show,% A_LoopField
}
DisplayInfo(Info1,Info2,Position=0)
{
    if !Position
        Position := 999999999
    Position++
    StringSplit,DisInfo,Info2,% Chr(251)
    if (Info1="M")
        LV_Insert(Position,"","Move Mouse","X=" DisInfo1 " " "Y=" DisInfo2)
    else if (Info1="C")
        LV_Insert(Position,"","Click",(DisInfo1 = "L" ? "Button=Left" : (DisInfo1 = "R" ? "Button=Right" : "Button=Middle")) " " (DisInfo2="" ? "" : "X=" DisInfo2) " " (DisInfo3="" ? "" : "Y=" DisInfo3) " " (DisInfo4="" ? "" : DisInfo4="D" ? "State=Down" : "State=Up"))
    else if (Info1="K")
        LV_Insert(Position,"","Keyboard",Info2)
    else if (Info1="D")        
        LV_Insert(Position,"","Delay",Info2 " ms")
    else if (Info1="W")        
        LV_Insert(Position,"","Window",(DisInfo6="" ? "" : "Title=" DisInfo6) " " (DisInfo5="" ? "" : "Class=" DisInfo5) " " (DisInfo1="" ? "" : "X=" DisInfo1) " " (DisInfo2="" ? "" : "Y=" DisInfo2) " " (DisInfo3="" ? "" : "W=" DisInfo3) " " (DisInfo4="" ? "" : "H=" DisInfo3))
}
InsertInfo(Info,Line)
{
    global XMR_Data
    Loop,Parse,XMR_Data,`n
    {
        Result.= A_LoopField "`n"
        if (A_Index=Line)
            Result .= Info "`n"
    }
    XMR_Data := RTrim(Result,"`n")
    if !Line
        XMR_Data := Info
}
DelInfo(Line)
{
    global XMR_Data
    Loop,Parse,XMR_Data,`n
    {
        if (A_Index=Line)
            continue
        Result.= A_LoopField "`n"
    }
    XMR_Data := RTrim(Result,"`n")
}
    ;~ StopXMRFlag        ; (Required)
        ;~ StopXMRFlag := 0    ; Keep Recording.
        ;~ StopXMRFlag := 1    ; Stop Recording and return the time has passed.
    ;~ CoordType    ;~ Affects to get Mouse Movements and Mouse Clicks Coordinates. See More in AHK help file > CoordMode
        ;~ CoordType := Client    ;~ (Default) Coordinates are relative to the active window's client area, which excludes the window's title bar, menu.
                                ;~ You can use the file you recorded on almost computer (with Windows OS >= 2k) with Screen Resolution >= Yours.
        ;~ CoordType := Screen ;~ () Coordinates are relative to the desktop.
                                ;~ You can only use the file you recorded on the computers that have the same Screen Resolution with yours.
        ;~ BlockInputType     := On || Off || MouseMove        ; See AHK help file > BlockInput
XMR(ByRef StopXMRFlag,CoordModeType="Screen")
{
KeyList :=
(Join
"Browser_Back|Browser_Forward|Browser_Refresh|Browser_Stop|Browser_Search|Browser_Favorites|Browser_Home|Volume_Mute|Volume_Down|Volume_Up|Media_Next|Media_Prev|Media_Stop|Media_Play_Pause|Launch_Mail|Launch_Media|Launch_App1|Launch_App2|
Esc|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12|PrintScreen|Pause|Ins|Del|
``|1|2|3|4|5|6|7|8|9|0|-|=|Backspace|Home|
Tab|q|w|e|r|t|y|u|i|o|p|[|]|\|PgUp|
a|s|d|f|g|h|j|k|l|;|'|Enter|PgDn|
z|x|c|v|b|n|m|,|.|/|End|
Space|AppsKey|
ScrollLock|CapsLock|NumLock|
Up|Down|Left|Right|
Numpad0|NumpadIns|
Numpad1|NumpadEnd|
Numpad2|NumpadDown|
Numpad3|NumpadPgDn|
Numpad4|NumpadLeft|
Numpad5|NumpadClear|
Numpad6|NumpadRight|
Numpad7|NumpadHome|
Numpad8|NumpadUp|
Numpad9|NumpadPgUp|
NumpadDot|NumpadDel|
NumpadDiv|NumpadMult|
NumpadAdd|NumpadSub|
NumpadEnter|
WheelUp|WheelDown|
LControl|RControl|LShift|RShift|LAlt|RAlt|LWin|RWin"
)
    FirstTickCount := A_TickCount    ;~ Record Time Interval
    TimeIntervalRecord()
    MouseClickRecord()
    KeyboardRecord(KeyList)    ;~ Record Keyboard actions
    Loop {    ;~ Start recording
        if (StopXMRFlag) {
        KeyboardRecord(KeyList,"Off")
        MouseClickRecord("Off")
        ;~ StopXMRFlag := A_TickCount - FirstTickCount
        return, LTrim(XMR_Data,"`n")
        }
        if (KeyName="")
            if (WindowInfo := WindowInfoRecord())    
            {
                if (TimePass := TimeIntervalRecord())
                    XMR_Data .= "`nD" Chr(252) TimePass
                XMR_Data .= "`n" WindowInfo
            }
        if (MouseMove := IsMouseMove(CoordModeType))    ;~ Record mouse movement
            XMR_Data .= "`n" MouseMove
        Sleep -1
    }
    KeyBoardRecord:
        Critical
        if StopXMRFlag
            return
        
        KeyName := SubStr(A_ThisHotkey,4)
        if KeyName in LWin Up,RWin Up
            IfInString,A_PriorHotkey,Win
            Send, {LWin}
        if (TimePass := TimeIntervalRecord())
            XMR_Data .= "`nD" Chr(252) TimePass
        if (KeyName<>"Up")&& (InStr(KeyName,"Up"))
             XMR_Data .= "`nK" Chr(252) KeyName
        else XMR_Data .= "`nK" Chr(252) KeyName " Down"
        KeyName := ""
    return
    MouseClick:
    Critical
        CoordMode,Mouse
        MouseGetPos,XPos,YPos
        if (CoordModeType<>"Screen") {
            WinGetPos,WinX,WinY,,,A
            XPos -= WinX,YPos -= WinY
        }
        if (WindowInfo := WindowInfoRecord())    
            XMR_Data .= "`n" WindowInfo
        if (TimePass := TimeIntervalRecord())
            XMR_Data .= "`nD" Chr(252) TimePass
        if InStr(A_ThisHotkey,"Up")
            XMR_Data .= "`nC" Chr(252) SubStr(A_ThisHotkey,4,1) Chr(251) XPos Chr(251) YPos Chr(251) "U"
        else XMR_Data .= "`nC" Chr(252) SubStr(A_ThisHotkey,4,1) Chr(251) XPos Chr(251) YPos Chr(251) "D"
    return
}
    KeyboardRecord(KeyList,State = "On") {
     Loop, Parse, KeyList, |
        {
            Hotkey, ~*$%A_LoopField%, KeyBoardRecord, %State% UseErrorLevel
            Hotkey, ~*$%A_LoopField% Up, KeyBoardRecord, %State% UseErrorLevel
        }
    }
    IsMouseMove(CoordModeType="Screen")
    {
        static LastPos
        CoordMode,Mouse
        MouseGetPos,XPos,YPos
        if (LastPos = XPos YPos)
            return
        if !(TimePass := TimeIntervalRecord())
            return
        LastPos := XPos YPos
        if (CoordModeType<>"Screen") {    
            WinGetPos,WinX,WinY,,,A
            XPos -= WinX,YPos -= WinY
        }
        return, "D" Chr(252) TimePass "`nM" Chr(252) XPos Chr(251) YPos
    }
    MouseClickRecord(State = "On") {
        Hotkey,~*$LButton,MouseClick, %State% UseErrorLevel
        Hotkey,~*$RButton,MouseClick, %State% UseErrorLevel
        Hotkey,~*$MButton,MouseClick, %State% UseErrorLevel
        Hotkey,~*$LButton Up,MouseClick, %State% UseErrorLevel
        Hotkey,~*$RButton Up,MouseClick, %State% UseErrorLevel
        Hotkey,~*$MButton Up,MouseClick, %State% UseErrorLevel
    }
    WindowInfoRecord(Reset=0) {
        static Info_Old
        if Reset
        {
            Info_Old := ""
            return
        }
        WinGetActiveStats,WinTitle,W,H,XPos,YPos
        WinGetClass,WinClass,A
        if ((Info_Old = WinTitle WinClass XPos YPos W H) OR !WinClass OR (WinClass="Shell_TrayWnd") OR (WinClass="Button") OR !W)
            return
        Info_Old := WinTitle WinClass XPos YPos W H
        return "W" Chr(252) XPos Chr(251) YPos Chr(251) W Chr(251) H Chr(251) WinClass Chr(251) WinTitle
    }
    TimeIntervalRecord()    {
        static LastTickCount := A_TickCount
        Result := A_TickCount- LastTickCount
        LastTickCount := A_TickCount
        return, Result
    }
XMF(ByRef XMR,WT=0,WC=0,WP=0,WS=0,M=0,C=0,K=0,D=0,DefaultDelay=0)
{
    Loop,Parse,XMR,`n,`r
        {
        W := WT||WC||WP||WS ? 1 : 0
        StringSplit,Info,A_LoopField,% Chr(252)
        if !(%Info1%) {
            if (Info1="D")
                LastDelay += Info2
            continue
            }
        if (Info1="D") {
                LastDelay += Info2
                continue
            }
        if (LastDelay) {
            if (D)
                Result .= "`nD" Chr(252) LastDelay
            else if (DefaultDelay)
                Result .= "`nD" Chr(252) DefaultDelay
            LastDelay := 0
        }
        if (Info1="W") {
            StringSplit,WinInfo,Info2,% Chr(251)
            WinInfo := WP ? WinInfo1 Chr(251) WinInfo2 Chr(251) : Chr(251) Chr(251)
            WinInfo .= WS ? WinInfo3 Chr(251) WinInfo4 Chr(251) : Chr(251) Chr(251)
            WinInfo .= WC ? WinInfo5 Chr(251) : Chr(251)
            WinInfo .= WT ? WinInfo6 : ""
            Result .= "`n" "W" Chr(252) WinInfo
        }
        else
            Result .= "`n" A_LoopField
        }
    XMR := Trim(Result,"`n")
}
    ;~ StopXMRFlag := 0     ; Keep Playing.
    ;~ StopXMRFlag := 1    ; Stop Playing.
    ;~ XMR_Data : var store data recorded.
    ;~ Return Value : the time has passed since starting playing.
XMP(ByRef StopXMPFlag,XMR_Data="",CoordModeType="Screen",BlockInputType="MouseMove") {
FirstTickCount := A_TickCount
TotalTime := 0
XPos := 0
YPos := 0
CoordMode,Mouse,Screen
if (BlockInputType<>"Off")
    BlockInput, % BlockInputType
    Loop,Parse,XMR_Data,`n
    {
        if StopXMPFlag
            break
        StringSplit,Info,A_LoopField,% Chr(252)
        StringSplit,Detail,Info2,% Chr(251)
        if (Info1 = "M") {
            ;~ if (A_TickCount - FirstTickCount <= TotalTime)
                MouseMove,% Detail1 + XPos,% Detail2 + YPos,0
        }
        else if (Info1 = "W") {
                    Title := Detail6
                    if Detail5
                        Title .= " ahk_class " Detail5
                    IfWinExist,% Title
                    {
                        WinGetPos,XPos,YPos,W,H,% Title
                        if (XPos YPos <> Detail1 Detail2)&&(Detail1 Detail2 <> "")
                            WinMove,% Title,,% Detail1,% Detail2
                        if (W H <> Detail3 Detail4)&&(Detail3 Detail4 <> "")
                            WinMove,% Title,,,,% Detail3,% Detail4
                        IfWinNotActive, % Title
                            WinActivate,% Title
                        if (CoordModeType="Screen") {
                            XPos := 0
                            YPos := 0
                        }
                    }
                }
        else if (Info1 = "K")
                Send,% "{" Detail1 "}"
        else if (Info1 = "C")
                MouseClick,% Detail1,% Detail2 + XPos,% Detail3 + YPos,1,0,% Detail4
        else if (Info1 = "D")
        {
            TotalTime += Detail1
            while (A_TickCount - FirstTickCount < TotalTime)
                if StopXMPFlag
                    break
            }
    }
if (BlockInputType<>"Off") {
    BlockInput,Off
    BlockInput,MouseMoveOff
    }
return, A_TickCount - FirstTickCount
}
XMR2AHK(XMR,CoordType="Screen",BlockInputType="Off")
{
    AHK_Data := "CoordMode,Mouse," CoordType "`n"
    if (BlockInputType<>"Off")
        AHK_Data .= "BlockInput," BlockInputType "`n"
    Loop,Parse,XMR,`n,`r
    {
        StringSplit,Info,A_LoopField,% Chr(252)
        if (Info1 = "M")
                AHK_Data .= MouseMove2AHK(Info2) "`n"
        else if (Info1 = "C")
            AHK_Data .= Click2AHK(Info2) "`n"
        else if (Info1 = "W")
            AHK_Data .= WindowInfo2AHK(Info2) "`n"
        else if (Info1 = "K")
                AHK_Data .= "Send,{" Info2 "}" "`n"
        else if (Info1 = "D")
                AHK_Data .= "Sleep," Info2 "`n"
    }
    if (BlockInputType<>"Off")
        AHK_Data .= "BlockInput,Off`nBlockInput,MouseMoveOff"
    return, RTrim(AHK_Data,"`n")
}
WindowInfo2AHK(Data) {
    StringSplit,Info,Data,% Chr(251)
    Title := Info6
    if Info5
    Title .= " ahk_class " Info5
    if !Title
        return
    Result := (Info1<>"" && Info3<>"" ? "WinGetPos,XPos,YPos,W,H," Title "`nif (XPos YPos W H <> " Info1 Info2 Info3 Info4 ")`n WinMove," Title ",," Info1 "," Info2 "," Info3 "," Info4 "`n" : Info1<>"" ? "WinGetPos,XPos,YPos,,," Title "`nif (XPos YPos<> " Info1 Info2 ")`n WinMove," Title ",," Info1 "," Info2 "`n": Info3<>"" ? "WinGetPos,,,W,H," Title "`nif ( W H <> " Info3 Info4 ")`n WinMove," Title ",,,," Info3 "," Info4 "`n" : "")
    Result .= "IfWinNotActive," Title "`nWinActivate," Title
return Result
}
MouseMove2AHK(Data) {
    StringSplit,Info,Data,% Chr(251)
    return, "MouseMove," Info1 "," Info2
}
Click2AHK(Data)
{
    StringSplit,Info,Data,% Chr(251)
    return, "MouseClick," Info1 "," Info2 "," Info3 ",,," Info4
}
Автор: OnMyDSeeAtAll
Дата сообщения: 01.10.2014 15:09

Цитата:
...как добавить поддержку кириллицы в этот рекордер?
В функции KeyboardRecord (599 линия кода) меняем содержимое строк на:
Код: ; Hotkey, ~*$%A_LoopField%, KeyBoardRecord, %State% UseErrorLevel
; Hotkey, ~*$%A_LoopField% Up, KeyBoardRecord, %State% UseErrorLevel
Hotkey, % FormatKeyVK(GetKeyVK(A_LoopField)), % "KeyBoardRecord", % State " UseErrorLevel"
Hotkey,
% FormatKeyVK(GetKeyVK(A_LoopField))" Up", % "KeyBoardRecord", % State " UseErrorLevel"
Автор: thejustsoul
Дата сообщения: 01.10.2014 18:03
OnMyDSeeAtAll
Большое спасибо, все работает!
Маленький вопрос, а рекордеры вообще проверяют в какой раскладке они записывают и вводят? Т.е. если записано все в англ. раскладке, но при воспроизведении, в блокноте например, стоит рус. раскладка, то введется на русском (=инвертировано, т.е. не как задумывалось). Или это потом руками в макросе редактировать (искать отдельно функцию проверки если такая есть вообще и прописывать)?

И вообще мелкий вопрос, в коде выше в строке:
%State% UseErrorLevel
а в исправленном:
% State " UseErrorLevel"
"%" не хватает после State или так и должно быть?
Автор: OnMyDSeeAtAll
Дата сообщения: 01.10.2014 22:07

Цитата:
...а рекордеры вообще проверяют в какой раскладке они записывают и вводят?
Думаю что нет, да и зачем этот функционал им?, их задача в другом.
Цитата:
..."%" не хватает после State или так и должно быть?
Об этом можно почитать в обзаце Чтение содержимого переменных русской справки.
Автор: thejustsoul
Дата сообщения: 02.10.2014 08:09
OnMyDSeeAtAll

Цитата:
Об этом можно почитать в обзаце Чтение содержимого переменных русской справки.

Теперь ясно, спасибо еще раз.
Автор: ZevSforum
Дата сообщения: 03.10.2014 02:36
Ребят, токо увидел такую прогу, случайно, офигеть класс. Изучил много чего, даже получилось как на первый раз ). Но есть вопросы.

У меня при сканировании, надо нажать 5 разных кнопок прежде чем запускается сканирование.
Так вот, в проге когда она жмет кнопки по очереди что я вписал, каждый раз окно становится активным (появляется на передний план), то есть параллельно что-то делать в этот момент - нереально, ибо окно вылазит постоянно.

Вопрос:
1. Есть-ли команда, чтобы все действия выполнялись в фоне, не активируя каждый раз окно на передний план??
2. Есть ли такая же команда для открытия новых окон, чтобы они открывались тоже в фоне?

3. И еще. Одну кнопку никак немогу забить на выполнение. Просто апздец. Я правда обошел ее, заманухами умными, но это муторно, и все-же интересно в чем трабла.
Скрин -


Команда:

Код: ControlClick CMyBmpButton2_Class10, ScanGear
Автор: thejustsoul
Дата сообщения: 05.10.2014 13:52
Подскажите, как написать скрипт, чтобы он передавал любые переданные ему параметры в запускаемую программу.. Т.е. например такой маленький скрипт для запуска ФФ в портативном режиме:

Код: #NoTrayIcon
#NoEnv
RunWait, "%A_ScriptDir%\firefox.exe" -profile "%A_ScriptDir%\profile"
Return
Автор: Krot66
Дата сообщения: 05.10.2014 18:30
thejustsoul
Как передавать скрипту параметры командной строки
Автор: thejustsoul
Дата сообщения: 05.10.2014 19:12
Krot66
Я не просил давать ссылки на сайты, а попросил конкретное решение вопроса (этот материал я уже читал до того как спрашивать, и не только его, и там нет ничего, что бы мне помогло (я не спец в AHK), больше 3 часов гугления тоже не дало никакого результата. Все, что находил, не работало.

Раз уж вы нашли эту страницу (и считаете, что она поможет), помогите с решением вопроса?

Вопрос для знающих AutoHotKey, я уверен очень простой, всего лишь нужно определить, есть ли передаваемые параметры\аргументы скрипту и если есть запустить программу со всеми переданными параметрами (как есть), если нет, то запустить без параметров.
Автор: Krot66
Дата сообщения: 06.10.2014 11:13
thejustsoul
Параметры передаются скрипту в виде переменных %1%, %2% и пр. Их и надо использовать в Run
P.S. И спокойнее надо быть - здесь вам никто ничего не должен

Страницы: 12345678910111213141516171819202122232425262728293031323334

Предыдущая тема: как добавить ивритские шрифты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.