AutoHotKey FAQ 11.06.2023
Пропал в сети мой старый фак, выкладываю максимально последний.
# 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/#/ Как его суку скачать ?
- Лежат локально c:\DropBox\prg\AHK_lib\
- 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
В такой схеме прекрасно все !
- И то что я пишу в любимом текстовом редакторе
- И то что для отправки я использую AutoHotKeys и понимаю его возможности
- И все это доступно для всех в мире
- Все данные в одном единственном файле, никакого мусора Да я использую не чистый парсер 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"
Конец