#Requires AutoHotkey v2.0
MyGui := Gui()
LV := MyGui.Add("ListView", "r20", ["Name"])
LV.OnEvent("DoubleClick", LV_DoubleClick)
Loop read, "1.txt"
{
LV.Add(, A_LoopReadLine )
}
LV.ModifyCol
MyGui.Show
#HotIf WinActive(MyGui.hwnd)
Escape::ExitApp
Enter::
{
RowNumber := 0 ; This causes the first loop iteration to start the search at the top of the list.
Loop
{
RowNumber := LV.GetNext(RowNumber) ; Resume the search at the row after that found by the previous iteration.
if not RowNumber ; The above returned zero, so there are no more selected rows.
break
Text := LV.GetText(RowNumber)
MsgBox('The next selected row is #' RowNumber ', whose first field is "' Text '".')
}
MsgBox("YEA" LV.GetText(A_Index))
}
LV_DoubleClick(LV, RowNumber)
{
RowText := LV.GetText(RowNumber) ; Get the text from the row's first field.
ToolTip("You double-clicked row number " RowNumber ". Text: '" RowText "'")
}
Если файла нет, создать
if !FileExist("counter.txt")
FileAppend, 0, counter.txt
вообще все просто и почти как в PHP Дебилизм лишь в том что иногда надо в кавычках писать а иногда не надо
Loop, read, C:\Database Export.txt
{
Loop, parse, A_LoopReadLine, %A_Tab%
{
MsgBox, Field number %A_Index% is %A_LoopField%.
}
}
А так прочитать файл в объект/хэш:
current := Object()
Loop, read, % A_ScriptDir "\url.txt"
current[A_Index] := A_LoopReadLine
For i in current
itemlist .= "Item " A_Index " is: " current[i] "`n"
msgbox % itemlist
Как ждать изображение на экране ?
Это простой код, но есть в нете готовые развесистые функции... ну это просто минималка для поиска изображения на экране
нашел такую функцию, он генерит хероту какую-то ее еще чистить надо, а так то работает нормас.
Задетектить цвет в нужной точке ?
Sleep, 2000
PixelGetColor, color, 1914, 993
while color != "0xC1C1C1" {
Sleep, 2000
PixelGetColor, color, 1914, 993
}
MsgBox, We in end
Как выполнить код AutoHotKey в командной строке ? или одной строкой из PHP
Можно так: echo MsgBox Hi | "C:\Program Files\AutoHotkey\AutoHotkey.exe" * Но можно создать файл например в папке C:\Windows\ahk.bat @echo %* | "C:\Program Files\AutoHotkey\AutoHotkey.exe" * тогда можно будет запускать еще проще: ahk MsgBox, 64, Hello, World
Как скрыть бордюр/border у Edit ?
а вот так ! Gui Add, Edit, -E0x200 все вполне естественно и интуитивно
Как установить цвет фона у Edit и Text ?
Gui, Color,, 464646 ; Edit bg
Gui Add, Edit, cDBC410; edit text color
для Text:
Gui, Color, 1A1A1A ; Text bg
Gui Add, Text, cDBC410 ; font color
#Include biga.ahk
a1:=[]
a2:=[]
r:=[]
Loop, Read, 1.txt
a1.Push(A_LoopReadLine)
Loop, Read, 2.txt
a2.Push(A_LoopReadLine)
A := new biga()
res = % A.difference(a1,a2)
MsgBox % A.join(res,"`n")
Как запустить PHP скрипт и получить результат ?
RunWait, %ComSpec% /c php 1.php >out.txt
ListView как установить фокус на нужную строку
LV_Modify(pos, "+Select +Focus")
ListView как получить выделенную строку по нажатию на Enter
ListView отличается от ListBox.. но плевать.. короче Алгортм такой: Для ЛистВью содаем срытую кнопку, которая будет работать по дефолту. В этой кнопке можно проверять в каком листвью сработало так что тут проблемм нет, но все равно выглядит костыльно.Кстати вся информация есть тут: https://www.autohotkey.com/docs/commands/ListView.htmhttps://ahk-wiki.ru/listview В событии кнопки мы узнаем номер строки, но нему берем текст. Вообщем-то все как обычно но синтаксис выматывает:
; draw GUI
Gui,Add,ListView,-hdr h400,RunColumn
Gui,Add,Button, Hidden Default, ok ; when press Enter in ListView, then run ButtonOK event
Gui,Show
...
ButtonOK:
numline := LV_GetNext(0, "Focused")
LV_GetText(rowtext, numline) ; Get the text from the row's first field.
MsgBox, Text: "%rowtext%"
return
Дикость тут еще и в том что Событие ButtonOK нигде не прописано но оно есть и срабатывает по дефолту для кнопки по нажатию кнопки Enter на форме. Может это даже и удобно хз.
Окно всегда сверху
^SPACE:: Winset, Alwaysontop, , A ; ctrl + space
Return
Как передвинуть Chrome окно (да и любые другие)?
Перед тем как двигать окно надо его демаксимизировать, это главная хитрость
ключи в кавычках обязательно Если укажешь без кавычек, то огребеш ошибок
Как ведется этот сайт ahkey.ru ?
Сайт http://ahkey.ru - это сборник рецептов для AutoHotKeys, которые я добыл нелегким трудом. Часть ответов довольно просто найти, а часть пришлось выяснять на форуме поддержки, а часть нашлось в боевом крещении и борьбе с нелогизмами. Вообще я пишу все в одном единственном файле AutoHotKeys.md в разметке MarkDown. Как только я вношу новые изменения в этот файл. Я его отправляю на сервер. На сервере естественно написан небольшой скрипт на PHP:
А локально что бы отправить я использую очень просто скрипт на AutoHotKeys:
MsgBox, start POST transfer AutoHotKeys.md to ahkey.ru
URL := "http://ahkey.ru/script.php"
HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
HttpObj.Open("POST", URL, 0)
HttpObj.SetRequestHeader("Content-Type", "application/json")
FileRead, Body, AutoHotKeys.md
HttpObj.Send(Body)
Result := HttpObj.ResponseText
Status := HttpObj.Status
msgbox % "status: " status "`n`nresult: " result
В такой схеме прекрасно все !
И то что я пишу в любимом текстовом редакторе
И то что для отправки я использую AutoHotKeys и понимаю его возможности
И все это доступно для всех в мире
Все данные в одном единственном файле, никакого мусора Да я использую не чистый парсер MarkDown для отображения, но сам файл в годном MarkDown формате и доступен по адресу http://ahkey.ru/AutoHotKeys.md и вы можете его скачать зачем-то.
Тут и дураку ясно что это замена с регулярками и без, но ньюанс в том что при замене строк в StrReplace не надо экранировать слэши, а может и еще чего Поэтому есть уж надо тупую замену делать то ясно и понятно будет строковая замена..
Как узнать URL в браузере в текущей вкладке ?
#SingleInstance Force
#Include, Get the URL of the current (active) browser tab.ahk
F2::
a := GetActiveBrowserURL()
MsgBox, YEP %a%
Return
Способ 2 Этот способ более мощный, у него есть все возможности AutoHotKeys для расширения, дефолтные значения, не знаю как нассчет массивов и объектов, но по крайней мере уже лучше, ну и код немного короче
Способ 4 Еще культурно сделать сохранение параметров формы и потом восстанавливать при загрузке воспользоваться библиотекой JSON. ее надо подключать. https://github.com/cocobelgica/AutoHotkey-JSON По выходу из приложения сохраняем
Как проверить неопределенную / undefined / пустую переменную ?
if not file
MsgBox, I DIE
Как эмулировать нажатие клавиш в любой компонент на форме ?
Если элемент активен на экране, то парить не надо используй тупо Send
Send, {down}
если все плохо и элемент в жопе, то копай сюда, но чет у меня оно работало через раз.
global LBDone
Gui Add, ListBox,hwndLBDone, фывфыф|sdfasd
..
ControlSend,,{End}, ahk_id %LBDone%
Да так просто, но че-то мутки с названиями у них.. hwnd v g вот мутильщики.. если не сделать глобальной ИДшник, он тупо не будет работать в функциях, но будет работать в метках.. это вообще марока, пол дня искал косяк. Оказывается все дело в видимости.
Строки, Массивы. Более удобная работа с TF
https://github.com/hi5/TF Код стал еще меньше чем на PHP, но без ТФ все было бы печально. Классический исходник с TF:
Похоже единственный нормальный путь, это отловить событие:
OnMessage(0x0100, "CheckForKEYDOWN") ; WM_KEYDOWN
..
CheckForKEYDOWN(W, L, M, H)
{ ; VK_RETURN = 0x0D (13)
If (W = 13) && (A_GuiControl = "Todo")
{
есть метода через создание дефолтной кнопки, но тут не ясно а что если надо 2 кнопки есть метода с модификаторами, но там надо проверять активный элемент, тоже выглядит как костылина
Инкрементальный поиск в Listbox по любым символам
Gui Add, Edit, ge1 x1 y1 w180 h20 r1 vSearch
Gui Add, ListBox, x1 y21 w180 h400 vSite hwndSite, %sites%
..
; on edit change
e1:
Gui,Submit,NoHide
sitesArr := StrSplit(sites, "|")
newArr := []
newStr := ""
for k,v in sitesArr
{
if InStr(v, Search, false)>0
{
newArr.push(v)
}
}
for k,v in newArr
newStr .= "|" v
GuiControl, , Site, % newStr
GuiControl, Choose, site, 1
Return
Прекрасный вариант реализованный в ActionZipper_ahk
Как преобразовать массив в строку
вроде как можно было как-то через join но все варианты я не смог запустить, а вот простой цикл работает отлично
for k,v in newArr
newStr .= "|" v
Очистить массив
newArr := []
Цикл по массиву
array := ["one", "two", "three"]
; Iterate from 1 to the end of the array:
Loop % array.Length()
MsgBox % array[A_Index]
; Enumerate the array's contents:
For index, value in array
MsgBox % "Item " index " is '" value "'"
Как отловить изменение текста в Edit ?
ну например перехватом события нажатия на кнопке в элементе
OnMessage(0x0100, "CheckForKEYDOWN") ; WM_KEYDOWN
..
CheckForKEYDOWN(W, L, M, H)
{ ; VK_RETURN = 0x0D (13)
If (W = 13) && (A_GuiControl = "Todo")
{
и более крутой и правильный путь:
Gui Add, Edit, ge1
e1:
..
Return
тут мы просто определяем метку и по изменению оно само вызывает функцию
Как вместо многострочного Edit нарисовать однострочный
Вообще говоря по умолчанию если не рисовать высоту, то высота будет нормальной и однострочной, а если высоту указать, то вероятно придется указывать и количество строк. А высоту указывать придется т.к. Гуй как правило рисуется с определенной точностью. Gui Add, Edit, r1 там можно и по другому еще есть специальный параметр какой-то
позиция элемента относительно левого верхнего угла
Gui Add, Edit, x0 y0
Авторазмер элементов
Размеры автоматически не выставляются, поэтому используют костыль ловят событие ресайза и затем меняют ширины и высоты на самом деле не все так страшно, ведь это AutoHotKeys
guisize: ; отлавливаем событие ресайза
GuiControl, Move, MyEdit, w%A_GuiWidth% ; Задаем новые размеры элементу по имени MyEdit (который прописан как vMyEdit у элемента)
return
Видимо отсюда можно и в файл сбрасывать параметры формы например
и есть такой вариант, он ебанутый, т.к. красит вообще все, или я не разобрался:
Gui, Color, , Red ; вот установка фона
Gui, Add, ListBox, w400 r10 vLB ; а вот отрисовка элемента у которого задан фон
а вот так раскашивается фон текста: Gui Color, 11FF77
Listbox инкрементальный поиск по нескольким первым буквам
Кажется что он какой-то корявый, но пока других вариантов нет Gui Add, ListBox, sort x1 y40 w180 h400 vSite , %sites% да, надо просто добавить опцию sort
Listbox. Как поставить selected в нужное место ? Как выбрать нужный элемент в списке ?
Все просто до безобразия, никакие LBEX не нужны, да и LBEX у меня не завелся почему-то.
без включения Альтсабмита будет возвращаться текст текущего элемента
GuiControl, +AltSubmit, Site ; enable alternative submit
GuiControlGet, index, , Site ; get index to index var
GuiControl, -AltSubmit, Site ; disable alt submit
Найти все файлы в папке, кроме себя
Loop Files, *.ahk
{
if A_LoopFileFullPath = %A_ScriptName%
Continue
MsgBox, Filename = %A_LoopFileFullPath%
todo .= A_LoopFileFullPath "|"
}
Имя самого скрипта AutoHotKeys
A_ScriptName
Параметры запуска программы
%1% %2% %3%
Регулярка замена текста в строке
Тут все просто
fileName := RegExReplace(Todo, "\s*$", "")
Как записать текст в Edit да и в любой другой элемент
Да, надо перед обращением сделать GuiControlGet н уи это пиздец как бы.. такого я нигде не видел, типа это инициализация что ли , или поиск элемента как бы.
Честно все сделано через жопу. Данный ниже алгоритм расчитан на то что мы можем отловить нажатие Интера на любом окна в винде.
Gui Add, ListBox, x182 y1 w180 h400 vTodo gTodo, %todo%
Gui Show, w400 h420, ActionZipper
...
#IfWinActive, ActionZipper ; Эта херота проверяет активно ли наше приложение по заголовку окна
~Enter::
#IfWinActive
Gui, Submit, noHide
If Todo
Msgbox % Todo
return
а вот если этот вариант показался тугим, то следующий просто сломает башку:
Gui, Add, Button, Default, OK
Gui, Add, ListView, r5 w200 , time|size
Loop, 4
LV_Add("", a_now " " A_Index, 200*A_Index)
LV_ModifyCol()
Gui, Show
return
ButtonOK:
ControlGet, number, List, Count Focused, SysListView321, A
LV_GetText(var, Number,1)
msgbox % var
return
Как получить selected значение и индекс из ListBox ?
если кратко то GuiControlGet, Variable, , vGuiElementName Честно я задолбался искать пример. "Чужие для Хищников" сука.. но этот пример работает. Но оно работает при изменении выбранного элемента.. как это сделать по нажатию Enter пока не знаю.
Gui Add, ListBox, x182 y1 w180 h400 vTodo gTodo, %todo%
...
Todo:
GuiControlGet, ItemText, , Todo
GuiControl, +AltSubmit, Todo
GuiControlGet, ItemIndex, , Todo
GuiControl, -AltSubmit, Todo
MsgBox, 0, %Todo%, You selected the item with index %ItemIndex% and text %ItemText%
...