Easy-Auto-GUI-for-AHK-v2
Alguimist's 'Easy AutoGUI' GUI-Designer-Builder modified for Autohotkey v2.0, using mmikeww's AHKv2 converter (by samfisherirl)
Easy-Auto-GUI-for-AHK-v2 | ahk2_lib | |
---|---|---|
5 | 9 | |
150 | 176 | |
- | - | |
9.1 | 7.6 | |
3 months ago | 9 days ago | |
AutoHotkey | AutoHotkey | |
GNU General Public License v3.0 or later | MIT License |
The number of mentions indicates the total number of mentions that we've tracked plus the number of user suggested alternatives.
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.
Easy-Auto-GUI-for-AHK-v2
Posts with mentions or reviews of Easy-Auto-GUI-for-AHK-v2.
We have used some of these posts to build our list of alternatives
and similar projects. The last one was on 2023-05-28.
- EasyAutoGUI for ahkv2 - features, functions, and proper credits
-
Make life easier
- Easy-Auto-GUI-for-AHK-v2 I combined EasyAutoGUI(ahkv1) with AHKv2 Scriptconverter with a little custom code to make it output ahkv2 - Google-Bard-for-AHK-v2 I combined a python google bard chatbot library (premade) with a simple GUI from autohotkey so users can make autohotkey scripts that query bard
- Hi r/ahk. I'm looking for simple GUI examples to include in my AutoGUI mod. Think about a "template" button on a GUI creator for AHK. Besides what's in the documentation, do you have a nice simple GUI you'd like to share? I'd like it please.
- I NEED A SOCKET FOR DUMMIES
-
AutoGUI for AHKv2
I did very little work, just weaving the two solutions together. All the work was done by the creators just mentioned. Conversion happens when selecting "Save" or "Save as", command line parameters launch, read log for script path, and convert as ahkv2converter does. Full Solution. https://github.com/samfisherirl/Auto-GUI-for-AHK-v2
ahk2_lib
Posts with mentions or reviews of ahk2_lib.
We have used some of these posts to build our list of alternatives
and similar projects. The last one was on 2023-06-21.
-
is there a reason JXON.ahk accepts only Maps and not Class Objects?
I started using value := {x: "y"} after going through thqby's converted libraries for ahkv2. to be clear Im not indicting thqby's libs, but my understanding on why they are syntactically compliant. Specifically: https://github.com/thqby/ahk2_lib/blob/master/WinHttpRequest.ahk https://github.com/thqby/ahk2_lib/blob/master/Socket.ahk
-
GDIp vs GDIp_All ??
I doubt thqby's CGdip.ahk would work for my v1 scripts. :/ :)
- Detecting Focused Text Fields
-
I NEED A SOCKET FOR DUMMIES
[https://github.com/thqby/ahk2\_lib/blob/master/Socket.ahk](https://github.com/thqby/ahk2_lib/blob/master/Socket.ahk) That said, the use case described fits best a WM\_COPYDATA , is not only the standard way of doing it but also easy and unencumbered. I personally use this for when I need to communicate between scripts (and I just fixed a typo): [https://gist.github.com/cd70e009792fc2eb866f9f5caf1e395a](https://gist.github.com/cd70e009792fc2eb866f9f5caf1e395a) That is v1.1, but porting to v2 should be a problem. If you still want to use a TCP/UDP socket, let me know and I'll gladly take a look. example1: Code: Select all - Expand View - Download - Toggle Line numbers global sock := 0 #Include complete_application\_client.ahk #Requires AutoHotkey v2.0-beta ; 32-bit g := Gui() g.OnEvent("close",gui_close) g.OnEvent("escape",gui_close) g.Add("Edit","vMyEdit Multi w500 h500 ReadOnly","") g.Show() test_client() test_send() gui_close(*) { ExitApp } example2: Code: Select all - Expand View - Download - Toggle Line numbers #Requires AutoHotkey v2.0-beta ; 32-bit ; g := Gui() ; g.OnEvent("close",gui_close) ; g.OnEvent("escape",gui_close) ; g.Add("Edit","vMyEdit Multi w500 h500 ReadOnly","") ; g.Show() ; gui_close(*) { ; ExitApp ; } print_gui(str) { } client_data := "" F1::test_google() F2::test_server() F4::{ ; clear log client_data := "" } test_error() { sock := winsock("client-err",cb,"IPV4") ; sock.Connect("www.google.com",80) ; 127.0.0.1",27015 ; www.google.com",80 result := sock.Connect("localhost",5678) ; error is returned in callback } test_google() { sock := winsock("client",cb,"IPV6") sock.Connect("www.google.com",80) ; 127.0.0.1",27015 ; www.google.com",80 ; sock.Connect("www.autohotkey.com",80) ; www.autohotkey.com/download/2.0/ print_gui("Client connecting...`r`n`r`n") } test_server() { ; server - uses async to accept sockets sock := winsock("server",cb,"IPV4") sock.Bind("0.0.0.0",27015) ; "0.0.0.0",27015 sock.Listen() print_gui("Server listening...`r`n`r`n") } test_client() { ; client sock := winsock("client",cb,"IPV4") sock.Connect("127.0.0.1",27015) ; 127.0.0.1",27015 ; www.google.com",80 print_gui("Client connecting...`r`n`r`n") } test_google_blocking() { ; this uses no async at all sock := winsock("client",cb,"IPV6") domain := "www.autohotkey.com" ; www.google.com / www.autohotkey.com port := 443 ; 443 / 80 If !(r1 := sock.Connect(domain,port,true)) { ; www.google.com msgbox "Could not connect: " sock.err return } get_req := "GET / HTTP/1.1`r`n" . "Host: " domain "`r`n`r`n" strbuf := Buffer(StrPut(get_req,"UTF-8"),0) StrPut(get_req,strbuf,"UTF-8") If !(r2 := sock.Send(strbuf)) { Msgbox "Send failed." return } While !(buf:=sock.Recv()).size ; wait for data Sleep 10 result := "" while buf.size { result .= StrGet(buf,"UTF-8") ; collect data buf:=sock.Recv() } sock.Close() A_Clipboard := result msgbox "Done. Check clipboard." } test_send() { ; the connecting client doesn't use async sock := winsock("client", cb, "IPV4") If !(r := sock.Connect("127.0.0.1", 27015, true)) { ; connect as blocking, setting param #3 to TRUE msgbox "Could not connect." return ; handle a failed connect properly } msg := "abc" strbuf := Buffer(StrLen(msg) + 1) ; for UTF-8, take strLen() + 1 as the buffer size StrPut(msg, strbuf, "UTF-8") r := sock.Send(strbuf) ; check send result if necessary sock.Close() } cb(sock, event, err) { global client_data dbg("sock.name: " sock.name " / event: " event " / err: " err " ===========================") if (sock.name = "client") { if (event = "close") { msgbox "Address: " sock.addr "`n" "Port: " sock.port "`n`n" client_data A_Clipboard := client_data client_data := "" sock.close() } else if (event = "connect") { ; connection complete, if (err = 0) then it is a success msgbox("Client...`r`nConnect Addr: " sock.addr "`r`nConnect Port: " sock.port "`r`n`r`n") ; this does not check for failure } else if (event = "write") { ; client ready to send/write get_req := "GET / HTTP/1.1`r`n" . "Host: www.google.com`r`n`r`n" strbuf := Buffer(StrPut(get_req,"UTF-8"),0) StrPut(get_req,strbuf,"UTF-8") sock.Send(strbuf) msgbox("Client sends to server:`r`n" . "======================`r`n" . Trim(get_req,"`r`n") "`r`n" . "======================`r`n`r`n") } else if (event = "read") { ; there is data to be read buf := sock.Recv() client_data .= StrGet(buf,"UTF-8") } } else if (sock.name = "server") || instr(sock.name,"serving-") { if (event = "accept") { sock.Accept(&addr,&newsock) ; pass &addr param to extract addr of connected machine msgbox("======================`r`n" . "Server processes client connection:`r`n" . "address: " newsock.addr "`r`n" . "======================`r`n`r`n" ) } else if (event = "close") { } else if (event = "read") { If !(buf := sock.Recv()).size ; get buffer, check size, return on zero-size buffer return dbg("buf size: " buf.size) msgbox("======================`r`n" . "Server recieved from client:`r`n" . Trim(strget(buf,"UTF-8"),"`r`n") "`r`n" . "======================`r`n`r`n") } } else if (sock.name = "client-err") { ; this is how you catch an error with async / non-blocking if (event = "connect") && err msgbox sock.name ": " event ": err: " err } ; dbg(sock.name ": " event ": err: " err) ; to make it easier to see all the events } ; ========================================================== ; support funcs ; ========================================================== AppendText(EditHwnd, sInput, loc := "bottom") { ; Posted by TheGood: https://autohotkey.com/board/topic/52441-append-text-to-an-edit-control/#entry328342 insertPos := (loc="bottom") ? SendMessage(0x000E, 0, 0,, "ahk_id " EditHwnd) : 0 ; WM_GETTEXTLENGTH r1 := SendMessage(0x00B1, insertPos, insertPos,, "ahk_id " EditHwnd) ; EM_SETSEL - place cursor for insert r2 := SendMessage(0x00C2, False, StrPtr(sInput),, "ahk_id " EditHwnd) ; EM_REPLACESEL - insert text at cursor } dbg(_in) { ; AHK v2 Loop Parse _in, "`n", "`r" OutputDebug "AHK: " A_LoopField } example3: Code: Select all - Expand View - Download - Toggle Line numbers #Include _socket.ahk #Requires AutoHotkey v2.0-beta ; 32-bit g := Gui() g.OnEvent("close",gui_close) g.OnEvent("escape",gui_close) g.Add("Edit","vMyEdit Multi w500 h500 ReadOnly","") g.Show() gui_close(*) { ExitApp } print_gui(str) { global g AppendText(g["MyEdit"].hwnd,str) } client_data := "" F1::test_google() F3::test_client() F4::{ ; clear log client_data := "" g["MyEdit"].Value := "" } F5::test_error() F6::test_send() F7::test_google_blocking() test_error() { sock := winsock("client-err",cb,"IPV4") ; sock.Connect("www.google.com",80) ; 127.0.0.1",27015 ; www.google.com",80 result := sock.Connect("localhost",5678) ; error is returned in callback } test_google() { sock := winsock("client",cb,"IPV6") sock.Connect("www.google.com",80) ; 127.0.0.1",27015 ; www.google.com",80 ; sock.Connect("www.autohotkey.com",80) ; www.autohotkey.com/download/2.0/ print_gui("Client connecting...`r`n`r`n") } test_server() { ; server - uses async to accept sockets sock := winsock("server",cb,"IPV4") sock.Bind("0.0.0.0",27015) ; "0.0.0.0",27015 sock.Listen() print_gui("Server listening...`r`n`r`n") } test_client() { ; client sock := winsock("client",cb,"IPV4") sock.Connect("127.0.0.1",27015) ; 127.0.0.1",27015 ; www.google.com",80 print_gui("Client connecting...`r`n`r`n") } test_google_blocking() { ; this uses no async at all sock := winsock("client",cb,"IPV6") domain := "www.autohotkey.com" ; www.google.com / www.autohotkey.com port := 443 ; 443 / 80 If !(r1 := sock.Connect(domain,port,true)) { ; www.google.com msgbox "Could not connect: " sock.err return } get_req := "GET / HTTP/1.1`r`n" . "Host: " domain "`r`n`r`n" strbuf := Buffer(StrPut(get_req,"UTF-8"),0) StrPut(get_req,strbuf,"UTF-8") If !(r2 := sock.Send(strbuf)) { Msgbox "Send failed." return } While !(buf:=sock.Recv()).size ; wait for data Sleep 10 result := "" while buf.size { result .= StrGet(buf,"UTF-8") ; collect data buf:=sock.Recv() } sock.Close() A_Clipboard := result msgbox "Done. Check clipboard." } test_send() { ; the connecting client doesn't use async sock := winsock("client", cb, "IPV4") If !(r := sock.Connect("127.0.0.1", 27015, true)) { ; connect as blocking, setting param #3 to TRUE msgbox "Could not connect." return ; handle a failed connect properly } msg := "abc" strbuf := Buffer(StrLen(msg) + 1) ; for UTF-8, take strLen() + 1 as the buffer size StrPut(msg, strbuf, "UTF-8") r := sock.Send(strbuf) ; check send result if necessary sock.Close() } cb(sock, event, err) { global client_data dbg("sock.name: " sock.name " / event: " event " / err: " err " ===========================") if (sock.name = "client") { if (event = "close") { msgbox "Address: " sock.addr "`n" "Port: " sock.port "`n`n" client_data A_Clipboard := client_data client_data := "" sock.close() } else if (event = "connect") { ; connection complete, if (err = 0) then it is a success print_gui("Client...`r`nConnect Addr: " sock.addr "`r`nConnect Port: " sock.port "`r`n`r`n") ; this does not check for failure } else if (event = "write") { ; client ready to send/write get_req := "GET / HTTP/1.1`r`n" . "Host: www.google.com`r`n`r`n" strbuf := Buffer(StrPut(get_req,"UTF-8"),0) StrPut(get_req,strbuf,"UTF-8") sock.Send(strbuf) print_gui("Client sends to server:`r`n" . "======================`r`n" . Trim(get_req,"`r`n") "`r`n" . "======================`r`n`r`n") } else if (event = "read") { ; there is data to be read buf := sock.Recv() client_data .= StrGet(buf,"UTF-8") } } else if (sock.name = "server") || instr(sock.name,"serving-") { if (event = "accept") { sock.Accept(&addr,&newsock) ; pass &addr param to extract addr of connected machine print_gui("======================`r`n" . "Server processes client connection:`r`n" . "address: " newsock.addr "`r`n" . "======================`r`n`r`n" ) } else if (event = "close") { } else if (event = "read") { If !(buf := sock.Recv()).size ; get buffer, check size, return on zero-size buffer return dbg("buf size: " buf.size) print_gui("======================`r`n" . "Server recieved from client:`r`n" . Trim(strget(buf,"UTF-8"),"`r`n") "`r`n" . "======================`r`n`r`n") } } else if (sock.name = "client-err") { ; this is how you catch an error with async / non-blocking if (event = "connect") && err msgbox sock.name ": " event ": err: " err } ; dbg(sock.name ": " event ": err: " err) ; to make it easier to see all the events } ; ========================================================== ; support funcs ; ========================================================== AppendText(EditHwnd, sInput, loc := "bottom") { ; Posted by TheGood: https://autohotkey.com/board/topic/52441-append-text-to-an-edit-control/#entry328342 insertPos := (loc="bottom") ? SendMessage(0x000E, 0, 0,, "ahk_id " EditHwnd) : 0 ; WM_GETTEXTLENGTH r1 := SendMessage(0x00B1, insertPos, insertPos,, "ahk_id " EditHwnd) ; EM_SETSEL - place cursor for insert r2 := SendMessage(0x00C2, False, StrPtr(sInput),, "ahk_id " EditHwnd) ; EM_REPLACESEL - insert text at cursor } dbg(_in) { ; AHK v2 Loop Parse _in, "`n", "`r" OutputDebug "AHK: " A_LoopField } example4: Code: Select all - Expand View - Download - Toggle Line numbers #Include _socket.ahk #Requires AutoHotkey v2.0-beta ; 32-bit g := Gui() g.OnEvent("close",gui_close) g.OnEvent("escape",gui_close) g.Add("Edit","vMyEdit Multi w500 h500 ReadOnly","") sock := test_server() g.Show()
-
Unable to retrieve string from Socket.ahk
Also, checkout the MCode for a callback in WebSockets (v2.0, v1.1 port), that is next level thinking.
- [Script Help]: How to Correctly call an API in AutoHotkey-V2?
- Chrome.ahk in Autohotkey 2.0
-
Neutron and Webapp.ahk. Do you have a preference? Is there something outside those two that the community likes? Looking to improve my gui has led me here.
I recently got word (thanks to u/RoughCalligrapher906) from these two projects: WebView2 (by thqby, another crazy guy of whom I have a crush #NoHomo), and Lexiko's winrt.ahk which is sort of wrapper for Windows Runtime that might be worth to look into.
What are some alternatives?
When comparing Easy-Auto-GUI-for-AHK-v2 and ahk2_lib you can also consider the following projects:
Google-Bard-for-AHK-v2 - Google Bard Chatbot for Autohotkey v2
WebSocket.ahk - Connect to a WebSocket server using AutoHotkey
AHK-v2-script-converter - AHK v1 -> v2 script converter
AHK-GDIp-Library-Compilation - Gdip_All library mega-compilation of user contributions, compatible with AHK v1.1 and AHK v2
ahk2
winrt.ahk - AutoHotkey language projection for the Windows Runtime
askai - Command Line Interface for OpenAi ChatGPT
AHKv2-Gdip - Gdip library compatiable with both AHK v1.1 and AHK v2
UIA-v2 - UIAutomation library for AHK v2, based on thqby's UIA library
Gdip - Official GDI+ library for Autohotkey
Socket_ahk2
Easy-Auto-GUI-for-AHK-v2 vs Google-Bard-for-AHK-v2
ahk2_lib vs WebSocket.ahk
Easy-Auto-GUI-for-AHK-v2 vs AHK-v2-script-converter
ahk2_lib vs AHK-GDIp-Library-Compilation
Easy-Auto-GUI-for-AHK-v2 vs ahk2
ahk2_lib vs winrt.ahk
Easy-Auto-GUI-for-AHK-v2 vs askai
ahk2_lib vs ahk2
ahk2_lib vs AHKv2-Gdip
ahk2_lib vs UIA-v2
ahk2_lib vs Gdip
ahk2_lib vs Socket_ahk2