AutoHotKey FAQ 11.06.2023

11.6.2023 - 797 просмотров ;)

Пропал в сети мой старый фак, выкладываю максимально последний.

# AutoHotKeys. FAQ

AutoHotKey 2 , Как из функции прочитать текст на форме в элементе таком-то

TB := MyGui.Add(«Edit», «r20 w600», «») MyGui.Add(«Button», «w80 vButtonOk», «okey»).OnEvent(«click»,ButtonOk) … ButtonOk(*) { MsgBox («well» TB.Text «!») ExitApp }

Переключить раскладку на английский

SendMessage, 0x50,, 0x4090409,, A ; английский

AutoHotKey 2. Как получить выбранный/selected элемент в listView по нажатию на Enter


Взято из примера https://www.autohotkey.com/docs/v2/lib/ListView.htm#GetNext

  #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 Дебилизм лишь в том что иногда надо в кавычках писать а иногда не надо

Если WinActivate не работает

titleToActivate := "BZProcessDS"
hWnd := WinExist(titleToActivate)
PostMessage, WM_SYSCOMMAND := 0x0112, SC_HOTKEY := 0xF150, hWnd,, ahk_id %hWnd%

Как прочитать файл в массив ?

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

Как ждать изображение на экране ?

Это простой код, но есть в нете готовые развесистые функции… ну это просто минималка для поиска изображения на экране

CoordMode Pixel
Loop,
{
    ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, LinkFeed1.png
    if (FoundX > 0) { 
        CoordMode Mouse, Screen
        Click, %FoundX% %FoundY%
        ...
        break
   }
   sleep, 200 
} 

Найти на экране изображение и кликнуть по нему

CoordMode Pixel
ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, LinkFeed1.png
CoordMode Mouse, Screen
Click, %FoundX% %FoundY%
Sleep, 100
CoordMode Pixel
ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, LinkFeed2.png
CoordMode Mouse, Screen
Click, %FoundX% %FoundY%
Sleep, 100
Send, {Tab}^v{Tab}

Найти по регулярке в переменную

FileRead, f, bg.txt
MsgBox, % f
RegExMatch(f, "s)<!`-`-StartFragment`-`->(.+)<!`-`-EndFragment`-`->", z)
MsgBox, % z

Как получить данные из буфера обмена clipboard в html формате ?

ClipboardGet_HTML( byref Data ) { ; www.autohotkey.com/forum/viewtopic.php?p=392624#392624
 If CBID := DllCall( "RegisterClipboardFormat", Str,"HTML Format", UInt )
  If DllCall( "IsClipboardFormatAvailable", UInt,CBID ) <> 0
   If DllCall( "OpenClipboard", UInt,0 ) <> 0
    If hData := DllCall( "GetClipboardData", UInt,CBID, UInt )
       DataL := DllCall( "GlobalSize", UInt,hData, UInt )
     , pData := DllCall( "GlobalLock", UInt,hData, UInt )
     , VarSetCapacity( data, dataL * ( A_IsUnicode ? 2 : 1 ) ), StrGet := "StrGet"
     , A_IsUnicode ? Data := %StrGet%( pData, dataL, 0 )
                   : DllCall( "lstrcpyn", Str,Data, UInt,pData, UInt,DataL )
     , DllCall( "GlobalUnlock", UInt,hData )
 DllCall( "CloseClipboard" )
Return dataL ? dataL : 0
}

If ClipboardGet_HTML( Data )
     MsgBox, % Data
Else SoundBeep

нашел такую функцию, он генерит хероту какую-то ее еще чистить надо, а так то работает нормас.

Задетектить цвет в нужной точке ?

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

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

https://www.autohotkey.com/docs/commands/Gui.htm#Color https://ahk-wiki.ru/gui#color

для ListView вообще делается так: GuiControl +BackgroundFF9977, MyListView

Крутые библиотеки/либы/скрипты AutoHotKeys

biga https://biga-ahk.github.io/biga.ahk/#/ Как его суку скачать ?

  1. Лежат локально c:\DropBox\prg\AHK_lib\
  2. https://github.com/biga-ahk/biga.ahk есть файл export.ahk это он и есть

https://github.com/Chunjee/array.ahk Аналог biga.AutoHotKeys функции для работы с массивами, обновлялся не так давно

https://github.com/Chunjee/json.ahk JSON

Сравнить 2 массива с помощью biga

#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.htm https://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 окно (да и любые другие)?

Перед тем как двигать окно надо его демаксимизировать, это главная хитрость

WinGet, WinStatus, MinMax, ahk_exe chrome.exe
if (WinStatus != 0)
  WinRestore, ahk_exe chrome.exe
WinMove, ahk_exe chrome.exe,, 50, 50, 800, 600

Ассоциативные массивы

Простой рабочий пример

z := []
z["name"] := "Boss"
z["nop"] := "nope"
MsgBox, % z["name"]

ключи в кавычках обязательно Если укажешь без кавычек, то огребеш ошибок

Как ведется этот сайт ahkey.ru ?

Сайт http://ahkey.ru — это сборник рецептов для AutoHotKeys, которые я добыл нелегким трудом. Часть ответов довольно просто найти, а часть пришлось выяснять на форуме поддержки, а часть нашлось в боевом крещении и борьбе с нелогизмами. Вообще я пишу все в одном единственном файле AutoHotKeys.md в разметке MarkDown. Как только я вношу новые изменения в этот файл. Я его отправляю на сервер. На сервере естественно написан небольшой скрипт на PHP:

$body = file_get_contents('php://input');
file_put_contents("AutoHotKeys.md",$body);

А локально что бы отправить я использую очень просто скрипт на 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

В такой схеме прекрасно все !

  1. И то что я пишу в любимом текстовом редакторе
  2. И то что для отправки я использую AutoHotKeys и понимаю его возможности
  3. И все это доступно для всех в мире
  4. Все данные в одном единственном файле, никакого мусора Да я использую не чистый парсер MarkDown для отображения, но сам файл в годном MarkDown формате и доступен по адресу http://ahkey.ru/AutoHotKeys.md и вы можете его скачать зачем-то.

Как отправить JSON в POST запросе ?

https://stackoverflow.com/questions/47855338/ahk-post-request-using-json-issue

URL := "http://localhost:8000/createPlayer"
HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
HttpObj.Open("POST", URL, 0)
HttpObj.SetRequestHeader("Content-Type", "application/json")
json_str := ({"name": "Any Name"})
Body := json_str
HttpObj.Send(Body)
MsgBox, %Body%
Result := HttpObj.ResponseText
Status := HttpObj.Status
msgbox % "status: " status "`n`nresult: " result

Инкрементальный поиск в Listbox без сортировок и без дополнительного компонента Edit

Gui, Add, ListBox, w200 r10 vSearchBox, %List%
OnMessage(0x0102, "WM_CHAR")
..
WM_CHAR(W, L, M, H) {
   ; LB_ERR = -1, LB_FINDSTRING = 0x018F, LB_SETCURSEL = 0x0186
   Static PrevTick := A_TickCount
        , Find := ""
   If (A_GuiControl = "SearchBox" ) {
      ThisTick := A_TickCount
      If ((ThisTick - PrevTick) > 500)
         Find := Chr(W)
      Else
         Find .= Chr(W)
      PrevTick := ThisTick
      ItemIndex := DllCall("SendMessage", "Ptr", H, "UInt", 0x018F, "Ptr", -1, "Ptr", &Find, "Ptr")
      DllCall("SendMessage", "Ptr", H, "UInt", 0x0186, "Ptr", ItemIndex, "Ptr", 0)
      Return 0
   }
}

Как видно в функции надо управлять именем vSearchBox. Оригинал тут https://www.autohotkey.com/boards/viewtopic.php?f=76&t=75215&p=325269#p325269

Как использовать UTF-8 ?

FileEncoding, UTF-8 Устанавливает кодировку по умолчанию для команд: FileRead, FileReadLine, Loop Read, FileAppend и FileOpen

Как поместить фокус на нужный элемент ?

Работает как часы для vSnippets: GuiControl, focus, Snippets

Разница между RegExReplace и StrReplace

folder := RegExReplace(A_LoopFileFullPath, "snippets\\" , "")
folder := StrReplace(A_LoopFileFullPath, "snippets\" , "")

Тут и дураку ясно что это замена с регулярками и без, но ньюанс в том что при замене строк в StrReplace не надо экранировать слэши, а может и еще чего Поэтому есть уж надо тупую замену делать то ясно и понятно будет строковая замена..

Как узнать URL в браузере в текущей вкладке ?

#SingleInstance Force
#Include, Get the URL of the current (active) browser tab.ahk

F2::
  a := GetActiveBrowserURL()
  MsgBox, YEP %a%
Return

Либа: https://www.autohotkey.com/boards/viewtopic.php?t=3702 или в папке ahk-lib

Как сделать сохранение и загрузку конфига с параметрами формы ?

Способ 1 Убогий способ сохраняет и загружает одну переменную, но это уже прогресс на сегодня. Вызывать функции откуда надо.

loadConfig(){
  FileRead, ItemIndex, position.txt
  GuiControl, Choose, RunList, %ItemIndex%
}

saveConfig(){
  GuiControl, +AltSubmit, RunList
  GuiControlGet, ItemIndex, , RunList
  GuiControl, -AltSubmit, RunList
  FileDelete, position.txt
  FileAppend, %ItemIndex%, position.txt
}

Способ 2 Этот способ более мощный, у него есть все возможности AutoHotKeys для расширения, дефолтные значения, не знаю как нассчет массивов и объектов, но по крайней мере уже лучше, ну и код немного короче

IniRead, itemIndex, config.ini, main, LBSites, 2
GuiControl, Choose, LBSites, %itemIndex%
..
saveConfig(){
  GuiControl, +AltSubmit, LBSites
  GuiControlGet, itemIndex, , LBSites
  IniWrite, %itemIndex%, config.ini, main, LBSites
}

Способ 4 Еще культурно сделать сохранение параметров формы и потом восстанавливать при загрузке воспользоваться библиотекой JSON. ее надо подключать. https://github.com/cocobelgica/AutoHotkey-JSON По выходу из приложения сохраняем

.. посеял пример )

По загрузке загружаем и меняем форму

FileRead, configJson,  config.json
config := JSON.Load(configJson)
GuiControl, Choose, Site, % config.siteIndex

Как сделать строки автозамены с разными символами кавычками да скобками ?

Дак как.. просто превалять символы апострофом и все но не все так просто работает с этим примером я впарился

Как скомпилировать программу, сделать .exe ?

Ahk2Exe.exe /in client.ahk /out client.exe /icon favicon.ico

Как получить заголовок текущего окна ?

WinGetActiveTitle, Title

Как сделать окно поверх других ?

Winset, Alwaysontop, , A

Как проверить неопределенную / 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:

#Include, tf.ahk

loop files, *.md
{
  file = !%A_LoopFileFullPath%
  TF_ReverseLines(file,1,0)
  TF_RemoveBlankLines(file)
  TF_Replace(file," | "," - ")
}

делает 3 изменения в списке файлов

Как отловить нажатие Enter в edit ?

Похоже единственный нормальный путь, это отловить событие:

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 там можно и по другому еще есть специальный параметр какой-то

Как очистить Edit ?

GuiControl,,Edit1,

Как очистить ListBox ?

GuiControl,,Site, |

Как Очистить и записать новые данные в Listbox ?

; Очистить
GuiControl, , Site, |
; перезаписать
GuiControl, , Site, |%sites%
GuiControl, , Site, |вфывф|dasdas|das

да, надо черточку впереди ставить.. это пиздец

Как сделать иконку приложению ?

Рисуем иконку на http://favicon.cc Кладем рядом и пишем

Menu, Tray, Icon, favicon.ico

позиция элемента относительно левого верхнего угла

Gui Add, Edit, x0 y0

Авторазмер элементов

Размеры автоматически не выставляются, поэтому используют костыль ловят событие ресайза и затем меняют ширины и высоты на самом деле не все так страшно, ведь это AutoHotKeys

guisize: ; отлавливаем событие ресайза
  GuiControl, Move, MyEdit, w%A_GuiWidth% ; Задаем новые размеры элементу по имени MyEdit (который прописан как vMyEdit у элемента)
return

Видимо отсюда можно и в файл сбрасывать параметры формы например

Прочитать страницу из интернета

  URLDownloadToFile, http://ya.ru, downloaded.txt
  FileRead, downloadedText, downloaded.txt

и тут есть другие примеры: https://www.autohotkey.com/docs/commands/URLDownloadToFile.htm

AutoHotKeys eval

Надежная 100 пудовая херота, работаетлучшедругих функций и быстро довольно таки, мне хватит для калькулятора

; calc eval
; Name: eval
; Version 1.1 (Tuesday, March 29, 2016)
; Created: Monday, March 28, 2016
; Author: tidbit
; Credit: TLM
; Description: Uses Javascript/COM to evaluate stringed math expressions.
; Supported constants and functions: http://www.w3schools.com/jsref/jsref_obj_math.asp
; Example: msgbox, % eval("5*pi+(7*sqrt(27))/2")
eval(exp)
{
  transform, exp, deref, %exp%
  ; make everything lowercase, set constants to uppercase
  exp:=format("{:l}", exp) 
  exp:=regExReplace(exp, "i)(E|LN2|LN10|LOG2E|LOG10E|PI|SQRT1_2|SQRT2)", "$U1")
  exp:=regExReplace(exp, "i)(abs|acos|asin|atan|atan2|ceil|cos|exp|floor"
  . "|log|max|min|pow|random|round|sin|sqrt|tan"
  . "|E|LN2|LN10|LOG2E|LOG10E|PI|SQRT1_2|SQRT2)", "Math.$1")
    obj:=ComObjCreate("HTMLfile")
    obj.write("<body><script>document.body.innerText=eval('" exp "');</script>")
    return inStr(cabbage:=obj.body.innerText, "body") ? "ERROR" : cabbage
}

но есть еще либа: http://www.computoredge.com/AutoHotkey/Free_AutoHotkey_Scripts_and_Apps_for_Learning_and_Generating_Ideas.html#Eval заметка о ем: https://jacks-autohotkey-blog.com/2020/03/23/eval-function-autohotkey-hotkey-math-calculations/#more-41236

Раскрасить фон элемента в заданный цвет

Использовать видимо либу https://github.com/AHK-just-me/Class_CtlColors https://www.autohotkey.com/boards/viewtopic.php?t=2197 пример, надо задать hwnd:

  Gui Add, ListBox,      x182 y1 w180 h400 vTodo hwndTodo, %linesListbox%
  CtlColors.Attach(Todo, "74BC74", "Black")

и есть такой вариант, он ебанутый, т.к. красит вообще все, или я не разобрался:

  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 у меня не завелся почему-то.

Gui Add, ListBox, x1   y1 w180 h400 vSite , %sites%
...
GuiControl, Choose, Site, 10

Как написать текст в консоль ?

Как так, но этот пример не сработал, копай сюда FileAppend, "Я текст", *

Как записать данные в файл ?

Все плохо

FileDelete, config.json
FileAppend, %strJson%, config.json

Это очень тупо )

JSON ?

https://github.com/cocobelgica/AutoHotkey-JSON

Как получить текущий элемент index в listbox ?

без включения Альтсабмита будет возвращаться текст текущего элемента

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 да и в любой другой элемент

Тут все просто:

Gui Add, Edit, vDebug
...
GuiControl,,Debug, 1231231 

Как получить данные из Edit или чего-то там еще ?

Да вообщем-то все просто:

    Gui Add, Edit, vLogList
    ..
    GuiControlGet, LogList
    MsgBox, %LogList%

Да, надо перед обращением сделать GuiControlGet н уи это пиздец как бы.. такого я нигде не видел, типа это инициализация что ли , или поиск элемента как бы.

Как отловить нажатие клавиши Enter в ListBox ?

Лучший вариант пока такой, работает :

#NoEnv
Gui, Add, ListBox, w180 h400 vTodo gTodo, Todo1||Todo2|Todo3
Gui, Show, w400 h420, ActionZipper
OnMessage(0x0100, "CheckForEnter") ; WM_KEYDOWN
Return

GuiClose:
ExitApp

Todo:
Return

CheckForEnter(W, L, M, H) { ; VK_RETURN = 0x0D (13)
   If (W = 13) && (A_GuiControl = "Todo")
      MsgBox, Bingo!
}

Честно все сделано через жопу. Данный ниже алгоритм расчитан на то что мы можем отловить нажатие Интера на любом окна в винде.

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%
...

Записать в listbox данные из файла

Одна запись на каждую строку листбокса

Loop, Read, 1.txt
    ListBox_Text .= A_LoopReadLine "|"

Gui Add, ListBox, x8 y3 w180 h186, %ListBox_Text%

Разбить каждую строку файла по разделителю | и в листбокс положить первую или вторую часть

Loop, Read, 1.txt 
{
    MyArray := StrSplit( A_LoopReadLine, "|" )
    ListBox_Text .= MyArray[2] "|"
}
Gui Add, ListBox, x8 y3 w180 h186, %ListBox_Text%

а вот кажется более правильный вариант как надо бы делать по уму если строки не надо обрабатывать:

FileRead, todo, todo.txt
todo := StrReplace(todo, "`n", "|")
Gui Add, ListBox, x8 y3 w180 h186, %todo%

если надо записать не при инициализации ГУЯ, то делается это так: GuiControl, , LBDone, |%done%

Аналог функции pre из DevelStudio

; print_r
print_r(obj) {
    For k,v in obj
        Str .= k " = " v "`n"
    MsgBox, % RTrim(Str, "`n")
}

print_r( arr )

похожий пример:

For i in url
    itemlist .= "Item " A_Index " is: " url[i] "`n"

Конец

Статьи из раздела