Acc: get text from all window/control elements

Post your working scripts, libraries and tools
User avatar
jeeswg
Posts: 5942
Joined: 19 Dec 2016, 01:58
Location: UK

Acc: get text from all window/control elements

28 Nov 2017, 16:50

This script will retrieve information, like so, for the Notepad window (tested on Windows 7):
4.2.4 c2 text [ Ln 1, Col 1 ][]
That is:
(acc path) (child ID/blank) (item type) [name text][value text]

You can then use this information to create code such as:

Code: Select all

;[Acc functions]
;Acc library (MSAA) and AccViewer download links - AutoHotkey Community
;https://autohotkey.com/boards/viewtopic.php?f=6&t=26201

q:: ;Notepad - get status bar text
WinGet, hWnd, ID, A
oAcc := Acc_Get("Object", "4.2.4", 0, "ahk_id " hWnd)
MsgBox, % oAcc.accName(2)
oAcc := ""
return

Code: Select all

q:: ;Notepad - get Acc info (window)
WinGet, hWnd, ID, A
MsgBox, % Clipboard := JEE_AccGetTextAll(hWnd, "`r`n")

;Edit control info is: 4.1.4
;the acc path will be 4.1.4
;and we will use 0 with accValue()
oAcc := Acc_Get("Object", "4.1.4", 0, "ahk_id " hWnd)
MsgBox, % oAcc.accValue(0)
oAcc := ""

;status bar info is: 4.2.4 c2
;the acc path will be 4.2.4
;and we will use 2 with accName()
oAcc := Acc_Get("Object", "4.2.4", 0, "ahk_id " hWnd)
MsgBox, % oAcc.accName(2)
oAcc := ""
return

w:: ;Notepad - get Acc info (controls)
ControlGet, hCtl1, Hwnd,, Edit1, A
ControlGet, hCtl2, Hwnd,, msctls_statusbar321, A
MsgBox, % Clipboard := JEE_AccGetTextAll(hCtl1, "`r`n")
MsgBox, % Clipboard := JEE_AccGetTextAll(hCtl2, "`r`n")

;Edit control info is: 4
;the acc path will be 4
;and we will use 0 with accValue()
oAcc := Acc_Get("Object", "4", 0, "ahk_id " hCtl1)
MsgBox, % oAcc.accValue(0)
oAcc := ""

;status bar info is: 4 c2
;the acc path will be 4
;and we will use 2 with accName()
oAcc := Acc_Get("Object", "4", 0, "ahk_id " hCtl2)
MsgBox, % oAcc.accName(2)
oAcc := ""
return

;==================================================

JEE_StrRept(vText, vNum)
{
	if (vNum <= 0)
		return
	return StrReplace(Format("{:" vNum "}", ""), " ", vText)
	;return StrReplace(Format("{:0" vNum "}", 0), 0, vText)
}

;==================================================

; ;e.g.
; q::
; WinGet, hWnd, ID, A
; MsgBox, % Clipboard := JEE_AccGetTextAll(hWnd, "`r`n")
; return

; ;e.g.
; q::
; ControlGet, hCtl, Hwnd,, Edit1, A
; MsgBox, % Clipboard := JEE_AccGetTextAll(hCtl, "`r`n")
; return

; ;e.g.
; q::
; ControlGetFocus, vCtlClassNN, A
; ControlGet, hCtl, Hwnd,, % vCtlClassNN, A
; MsgBox, % Clipboard := JEE_AccGetTextAll(hCtl, "`r`n")
; return

;vOpt: space-separated list
;vOpt: n#: e.g. n20 ;limit retrieve name to first 20 characters
;vOpt: v#: e.g. v20 ;limit retrieve value to first 20 characters

JEE_AccGetTextAll(hWnd:=0, vSep:="`n", vIndent:="`t", vOpt:="")
{
	vLimN := 20, vLimV := 20
	Loop, Parse, vOpt, % " "
	{
		vTemp := A_LoopField
		if (SubStr(vTemp, 1, 1) = "n")
			vLimN := SubStr(vTemp, 2)
		else if (SubStr(vTemp, 1, 1) = "v")
			vLimV := SubStr(vTemp, 2)
	}

	oMem := {}, oPos := {}
	;OBJID_WINDOW := 0x0
	oMem[1, 1] := Acc_ObjectFromWindow(hWnd, 0x0)
	oPos[1] := 1, vLevel := 1
	VarSetCapacity(vOutput, 1000000*2)

	Loop
	{
		if !vLevel
			break
		if !oMem[vLevel].HasKey(oPos[vLevel])
		{
			oMem.Delete(vLevel)
			oPos.Delete(vLevel)
			vLevelLast := vLevel, vLevel -= 1
			oPos[vLevel]++
			continue
		}
		oKey := oMem[vLevel, oPos[vLevel]]

		vName := "", vValue := ""
		if IsObject(oKey)
		{
			vRoleText := Acc_GetRoleText(oKey.accRole(0))
			try vName := oKey.accName(0)
			try vValue := oKey.accValue(0)
		}
		else
		{
			oParent := oMem[vLevel-1,oPos[vLevel-1]]
			vChildId := IsObject(oKey) ? 0 : oPos[vLevel]
			vRoleText := Acc_GetRoleText(oParent.accRole(vChildID))
			try vName := oParent.accName(vChildID)
			try vValue := oParent.accValue(vChildID)
		}
		if (StrLen(vName) > vLimN)
			vName := SubStr(vName, 1, vLimN) "..."
		if (StrLen(vValue) > vLimV)
			vValue := SubStr(vValue, 1, vLimV) "..."
		vName := RegExReplace(vName, "[`r`n]", " ")
		vValue := RegExReplace(vValue, "[`r`n]", " ")

		vAccPath := ""
		if IsObject(oKey)
		{
			Loop, % oPos.Length() - 1
				vAccPath .= (A_Index=1?"":".") oPos[A_Index+1]
		}
		else
		{
			Loop, % oPos.Length() - 2
				vAccPath .= (A_Index=1?"":".") oPos[A_Index+1]
			vAccPath .= " c" oPos[oPos.Length()]
		}
		vOutput .= vAccPath "`t" JEE_StrRept(vIndent, vLevel-1) vRoleText " [" vName "][" vValue "]" vSep

		oChildren := Acc_Children(oKey)
		if !oChildren.Length()
			oPos[vLevel]++
		else
		{
			vLevelLast := vLevel, vLevel += 1
			oMem[vLevel] := oChildren
			oPos[vLevel] := 1
		}
	}
	return SubStr(vOutput, 1, -StrLen(vSep))
}
The information retrieved should be similar to that which AccViewer shows.

Links:
Acc library (MSAA) and AccViewer download links - AutoHotkey Community
https://autohotkey.com/boards/viewtopic.php?f=6&t=26201
AccViewer Basic - AutoHotkey Community
https://autohotkey.com/boards/viewtopic.php?f=6&t=32039
jeeswg's Acc tutorial - AutoHotkey Community
https://autohotkey.com/boards/viewtopic.php?f=7&t=40590
Last edited by jeeswg on 28 Nov 2017, 17:10, edited 3 times in total.
homepage | tutorials | wish list | fun threads | donate
WARNING: copy your posts/messages before hitting Submit as you may lose them due to CAPTCHA
just me
Posts: 5955
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Acc: get text from all window/control elements

28 Nov 2017, 17:04

Which ACC lib should be used?
Last edited by just me on 28 Nov 2017, 17:32, edited 1 time in total.
User avatar
jeeswg
Posts: 5942
Joined: 19 Dec 2016, 01:58
Location: UK

Re: Acc: get text from all window/control elements

28 Nov 2017, 17:07

Hello just me, I've added a link. I usually always remember to add the link, but I guess I was just so focused this time, I didn't remember. [EDIT:] I've also added JEE_StrRept, which is also needed.

Btw for your viewing pleasure. Cheers.
GUIs via DllCall: get/set internal/external control text - AutoHotkey Community
https://autohotkey.com/boards/viewtopic.php?f=6&t=40514
homepage | tutorials | wish list | fun threads | donate
WARNING: copy your posts/messages before hitting Submit as you may lose them due to CAPTCHA
Himmilayah

Re: Acc: get text from all window/control elements

28 Nov 2017, 17:24

Thanks for doing this, I am on windows 10 just tested your example and got the following error

https://image.ibb.co/dP0rxm/accccc.png

I opened the acc.ahk and I saw what seems like the function there on line 654
wondering why the error, this is some great stuff hoping i can get it to work
User avatar
jeeswg
Posts: 5942
Joined: 19 Dec 2016, 01:58
Location: UK

Re: Acc: get text from all window/control elements

28 Nov 2017, 17:31

The only things I could recommend are to: try Notepad, try running AHK in admin mode, try AHK Unicode 32-bit. Try some simple examples with Acc, without using my functions. And worst-case scenario, try a Windows 7 PC.
homepage | tutorials | wish list | fun threads | donate
WARNING: copy your posts/messages before hitting Submit as you may lose them due to CAPTCHA
just me
Posts: 5955
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Acc: get text from all window/control elements

28 Nov 2017, 17:39

jeeswg wrote:GUIs via DllCall: get/set internal/external control text - AutoHotkey Community
https://autohotkey.com/boards/viewtopic.php?f=6&t=40514
I already looked at it, but I don't get how this is related to "GUIs via DllCall".
User avatar
jeeswg
Posts: 5942
Joined: 19 Dec 2016, 01:58
Location: UK

Re: Acc: get text from all window/control elements

28 Nov 2017, 17:55

- If I'm to create GUIs via DllCall, I need to be able to get and set the text of controls. That's usually the most complicated code in a GUI script, especially for remote applications.
- The idea of GUIs via DllCall, is to not use the AHK GUI commands, therefore I can't use the AHK treeview commands for example, I have to recreate them myself.
- Part of GUIs via DllCall, is to understand how the AHK GUI commands work, to solve problems. Also, I often needed to add functionality onto AHK GUIs via DllCall anyway. There were some limitations and frustrations with the AHK GUI commands. And also, it is useful as pseudocode for learning other programming languages, i.e. getting working prototypes in AHK, that I can then translate to other languages.
- My recollection is that you regarded notifications as the biggest problem. Whereas I didn't intend to write functions for handling notifications, they would be done on an ad hoc basis. However, seeing as AHK has wrapped notifications behind the GUI commands. What could be useful is lists of notification codes and general advice re. notifications. I will try to do this myself as I create a Notepad clone (my final GUIs via DllCall project), however, I will probably only scratch the surface, and not be in need of very much information. So if you know of any useful notification resources, I would be interested. Thanks.
- [EDIT:] I might try and list all the notifications that have special codes in AHK v1 (e.g. listviews) or are referenced in AHK v1, and experiment with them, also, I can check over .h files in C:\Program Files (x86)\Windows Kits\8.1 for constants. Plus, I have acquired one or two bits of template code from previous efforts.
homepage | tutorials | wish list | fun threads | donate
WARNING: copy your posts/messages before hitting Submit as you may lose them due to CAPTCHA
just me
Posts: 5955
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Acc: get text from all window/control elements

28 Nov 2017, 18:06

jeeswg wrote:- If I'm to create GUIs via DllCall, I need to be able to get and set the text of controls. That's usually the most complicated code in a GUI script, especially for remote applications.
If you will be able to create GUIs via DllCall providing all functionality of an AHK GUI, they will not be 'remote applications'.
User avatar
jeeswg
Posts: 5942
Joined: 19 Dec 2016, 01:58
Location: UK

Re: Acc: get text from all window/control elements

28 Nov 2017, 18:16

- True. However, AHK v1 doubled up on functions for internal/external controls, I thought it was much better to have the same functions usable for both.
- I needed functions for remote applications anyway, and the project required functions for internal controls, so as I saw it: might as well make them into the same function.
- Btw AHK v2 will now have various functions called ControlXXX that only apply to one type of control, which is confusing.
- Also, I never wanted objects for use with individual windows/controls, the hWnd/hCtl is a unique identifier that you can store in a variable, and you can apply functions to it. The jury's still out on whether I will use objects at some stage.
- As I see all the quandaries that lexikos is facing re. GUI, it reminds me about the question of scrapping commands, the more you logically churn through all the consequences of taking a specific action, the closer you get to something like my approach, which has answers to most of the problems, and achieves things in a simple way. I.e. functions with prefixes for each control type, and which work on internal and external controls.
v2-thoughts
https://autohotkey.com/v2/v2-thoughts.htm
homepage | tutorials | wish list | fun threads | donate
WARNING: copy your posts/messages before hitting Submit as you may lose them due to CAPTCHA
Himmilayah

Re: Acc: get text from all window/control elements

28 Nov 2017, 18:52

jeeswg wrote:Hello just me, I've added a link. I usually always remember to add the link, but I guess I was just so focused this time, I didn't remember. [EDIT:] I've also added JEE_StrRept, which is also needed.

Btw for your viewing pleasure. Cheers.
GUIs via DllCall: get/set internal/external control text - AutoHotkey Community
https://autohotkey.com/boards/viewtopic.php?f=6&t=40514
You said " I've also added JEE_StrRept, which is also needed."

I cannot find it :-( I am determined to make this work
User avatar
jeeswg
Posts: 5942
Joined: 19 Dec 2016, 01:58
Location: UK

Re: Acc: get text from all window/control elements

28 Nov 2017, 19:04

- JEE_StrRept is above, just do Ctrl+F on this webpage.
- One problem is which Acc library are you using. See the link that I provided: 'Acc library (MSAA) and AccViewer download links'. Perhaps you are trying to use sancarn's version.
homepage | tutorials | wish list | fun threads | donate
WARNING: copy your posts/messages before hitting Submit as you may lose them due to CAPTCHA
Himmilayah

Re: Acc: get text from all window/control elements

28 Nov 2017, 20:57

jeeswg wrote:- JEE_StrRept is above, just do Ctrl+F on this webpage.
- One problem is which Acc library are you using. See the link that I provided: 'Acc library (MSAA) and AccViewer download links'. Perhaps you are trying to use sancarn's version.
I had the wrong acc!!! I just tested acc viewer and your script and im getting the same exact data, that is very very good! thank you
User avatar
davebrny
Posts: 70
Joined: 05 Dec 2016, 06:26

Re: Acc: get text from all window/control elements

29 Nov 2017, 12:02

this seems a lot easier than having to drill down through the gui tree, especially for things programs like spotify that have a lot of nested items. thanks
guest3456
Posts: 2496
Joined: 09 Oct 2013, 10:31

Re: Acc: get text from all window/control elements

03 Dec 2017, 10:42

perhaps you can sancarn should work together and create one definitive acc library

BejiVR

Re: Acc: get text from all window/control elements

13 Dec 2017, 03:57

What an awesome tool! :bravo:

One question, If I make a script for a program lets call it MyProgram (a calendar program) and the data I need is at 4.1.4 will that location change as I need things to the calendar?

Will it work on other machines or on other machine the 4.1.4 will be another location?

Thank you
User avatar
jeeswg
Posts: 5942
Joined: 19 Dec 2016, 01:58
Location: UK

Re: Acc: get text from all window/control elements

13 Dec 2017, 05:15

- With external programs it's likely that things will stay the same, but it's not definite.
- Every so often, for any kind of software that supports another program, you'll see people complaining that 'it doesn't work since the update'.
- You should test adding calendar items or whatnot, and seeing if the numbers change.
- On the programs I've used Acc for, I've only had issues with numbers changing in Firefox/Chrome, changing due to updates.
- You should consider in your code, adding double-checks, things to confirm that the data you've retrieved is what you think it is, and fallback code/error messages, if the tests fail.
- I think that with one of the web browsers, I saw a number that changed every so often, each time you ran the code, so you had to do a loop, at a particular stage, to get the right child item. E.g. use a loop with Acc_Children (and .accRole) or perhaps Acc_ChildrenByRole (I haven't tested this, but it might be easier to use).
- Some of these numbers you would expect to stay constant, e.g. 4 always seems to be the window/control (something like that). Also some of the numbers may always be correct, but relative to a particular control, so the question becomes, how do you get the correct control (i.e. the correct ClassNN for the control), when you have multiple controls with the same class. (E.g. to identify controls, use the control's hWnd, once you know what it is, get a control's position/text/parent hWnd.)
homepage | tutorials | wish list | fun threads | donate
WARNING: copy your posts/messages before hitting Submit as you may lose them due to CAPTCHA
BejiVR

Re: Acc: get text from all window/control elements

13 Dec 2017, 16:39

jeeswg wrote:- With external programs it's likely that things will stay the same, but it's not definite.
- Every so often, for any kind of software that supports another program, you'll see people complaining that 'it doesn't work since the update'.
- You should test adding calendar items or whatnot, and seeing if the numbers change.
- On the programs I've used Acc for, I've only had issues with numbers changing in Firefox/Chrome, changing due to updates.
- You should consider in your code, adding double-checks, things to confirm that the data you've retrieved is what you think it is, and fallback code/error messages, if the tests fail.
- I think that with one of the web browsers, I saw a number that changed every so often, each time you ran the code, so you had to do a loop, at a particular stage, to get the right child item. E.g. use a loop with Acc_Children (and .accRole) or perhaps Acc_ChildrenByRole (I haven't tested this, but it might be easier to use).
- Some of these numbers you would expect to stay constant, e.g. 4 always seems to be the window/control (something like that). Also some of the numbers may always be correct, but relative to a particular control, so the question becomes, how do you get the correct control (i.e. the correct ClassNN for the control), when you have multiple controls with the same class. (E.g. to identify controls, use the control's hWnd, once you know what it is, get a control's position/text/parent hWnd.)
thank you, so far I tested adding a lot of data, restarting the system and everything stayed the same! I guess for every program i might use this i should test
BejiVR

Re: Acc: get text from all window/control elements

13 Dec 2017, 19:52

jeeswg wrote:- With external programs it's likely that things will stay the same, but it's not definite.
- Every so often, for any kind of software that supports another program, you'll see people complaining that 'it doesn't work since the update'.
- You should test adding calendar items or whatnot, and seeing if the numbers change.
- On the programs I've used Acc for, I've only had issues with numbers changing in Firefox/Chrome, changing due to updates.
- You should consider in your code, adding double-checks, things to confirm that the data you've retrieved is what you think it is, and fallback code/error messages, if the tests fail.
- I think that with one of the web browsers, I saw a number that changed every so often, each time you ran the code, so you had to do a loop, at a particular stage, to get the right child item. E.g. use a loop with Acc_Children (and .accRole) or perhaps Acc_ChildrenByRole (I haven't tested this, but it might be easier to use).
- Some of these numbers you would expect to stay constant, e.g. 4 always seems to be the window/control (something like that). Also some of the numbers may always be correct, but relative to a particular control, so the question becomes, how do you get the correct control (i.e. the correct ClassNN for the control), when you have multiple controls with the same class. (E.g. to identify controls, use the control's hWnd, once you know what it is, get a control's position/text/parent hWnd.)
Right now I use your script and get all text then regex ex to get just the data I need.

I think I can save time now that I know the location I need, 4.2 to be exact.

I figure if there is a way to just get that right from the start, do you have such code, I saw some other code on here but it will mess up the acc.ahk file

If you have such code handy please share

thank you
BejiVR

Re: Acc: get text from all window/control elements

14 Dec 2017, 02:29

jeeswg wrote:- With external programs it's likely that things will stay the same, but it's not definite.
- Every so often, for any kind of software that supports another program, you'll see people complaining that 'it doesn't work since the update'.
- You should test adding calendar items or whatnot, and seeing if the numbers change.
- On the programs I've used Acc for, I've only had issues with numbers changing in Firefox/Chrome, changing due to updates.
- You should consider in your code, adding double-checks, things to confirm that the data you've retrieved is what you think it is, and fallback code/error messages, if the tests fail.
- I think that with one of the web browsers, I saw a number that changed every so often, each time you ran the code, so you had to do a loop, at a particular stage, to get the right child item. E.g. use a loop with Acc_Children (and .accRole) or perhaps Acc_ChildrenByRole (I haven't tested this, but it might be easier to use).
- Some of these numbers you would expect to stay constant, e.g. 4 always seems to be the window/control (something like that). Also some of the numbers may always be correct, but relative to a particular control, so the question becomes, how do you get the correct control (i.e. the correct ClassNN for the control), when you have multiple controls with the same class. (E.g. to identify controls, use the control's hWnd, once you know what it is, get a control's position/text/parent hWnd.)
did more searching and found you already helped on this topic and it worked, thanks

for those curious here is the post for specific data using acc https://autohotkey.com/boards/viewtopic.php?f=5&t=28540
AtroCty
Posts: 4
Joined: 20 Dec 2017, 16:50

Re: Acc: get text from all window/control elements

21 Dec 2017, 09:40

Code: Select all

JEE_StrRept(vText, vNum)
{
	if (vNum <= 0)
		return
	return StrReplace(Format("{:" vNum "}", ""), " ", vText)
	;return StrReplace(Format("{:0" vNum "}", 0), 0, vText)
}

;==================================================

q::
WinGet, hWnd, ID, A
MsgBox, % Clipboard := JEE_AccGetTextAll(hWnd, "`r`n")
return

; ;e.g.
; q::
; ControlGet, hCtl, Hwnd,, Edit1, A
; MsgBox, % Clipboard := JEE_AccGetTextAll(hCtl, "`r`n")
; return

; ;e.g.
; q::
; ControlGetFocus, vCtlClassNN, A
; ControlGet, hCtl, Hwnd,, % vCtlClassNN, A
; MsgBox, % Clipboard := JEE_AccGetTextAll(hCtl, "`r`n")
; return

;vOpt: space-separated list
;vOpt: n#: e.g. n20 ;limit retrieve name to first 20 characters
;vOpt: v#: e.g. v20 ;limit retrieve value to first 20 characters

JEE_AccGetTextAll(hWnd:=0, vSep:="`n", vIndent:="`t", vOpt:="")
{
	file := FileOpen( "d:\ahk.txt", "a" )
	if !IsObject(file)
	{
	MsgBox Can't open "%FileName%" for writing.
	return
	}

	str := "ERSTER:"
	file.Write(str)
	
	vLimN := 20, vLimV := 20
	Loop, Parse, vOpt, % " "
	{
		vTemp := A_LoopField
		if (SubStr(vTemp, 1, 1) = "n")
			vLimN := SubStr(vTemp, 2)
		else if (SubStr(vTemp, 1, 1) = "v")
			vLimV := SubStr(vTemp, 2)
	}

	oMem := {}, oPos := {}
	;OBJID_WINDOW := 0x0
	oMem[1, 1] := Acc_ObjectFromWindow(hWnd, 0x0)
	oPos[1] := 1, vLevel := 1
	VarSetCapacity(vOutput, 1000000*2)

	Loop
	{
		if !vLevel
			break
		if !oMem[vLevel].HasKey(oPos[vLevel])
		{
			oMem.Delete(vLevel)
			oPos.Delete(vLevel)
			vLevelLast := vLevel, vLevel -= 1
			oPos[vLevel]++
			continue
		}
		oKey := oMem[vLevel, oPos[vLevel]]

		vName := "", vValue := ""
		if IsObject(oKey)
		{
			vRoleText := Acc_GetRoleText(oKey.accRole(0))
			try vName := oKey.accName(0)
			try vValue := oKey.accValue(0)
		}
		else
		{
			oParent := oMem[vLevel-1,oPos[vLevel-1]]
			vChildId := IsObject(oKey) ? 0 : oPos[vLevel]
			vRoleText := Acc_GetRoleText(oParent.accRole(vChildID))
			try vName := oParent.accName(vChildID)
			try vValue := oParent.accValue(vChildID)
		}
		if (StrLen(vName) > vLimN)
			vName := SubStr(vName, 1, vLimN) "..."
		if (StrLen(vValue) > vLimV)
			vValue := SubStr(vValue, 1, vLimV) "..."
		vName := RegExReplace(vName, "[`r`n]", " ")
		vValue := RegExReplace(vValue, "[`r`n]", " ")

		vAccPath := ""
		if IsObject(oKey)
		{
			Loop, % oPos.Length() - 1
				vAccPath .= (A_Index=1?"":".") oPos[A_Index+1]
		}
		else
		{
			Loop, % oPos.Length() - 2
				vAccPath .= (A_Index=1?"":".") oPos[A_Index+1]
			vAccPath .= " c" oPos[oPos.Length()]
		}
		
		vOutput .= vAccPath "`t" JEE_StrRept(vIndent, vLevel-1) vRoleText " [" vName "][" vValue "]" vSep

		oChildren := Acc_Children(oKey)
		if !oChildren.Length()
			oPos[vLevel]++
		else
		{
			vLevelLast := vLevel, vLevel += 1
			oMem[vLevel] := oChildren
			oPos[vLevel] := 1
		}
		
		file.Write(vOutput)
	}
	file.Close()
	return SubStr(vOutput, 1, -StrLen(vSep))
}
In case there are too many buttons, it will output into a textfile in d:\ahk.txt

Return to “Scripts and Functions”

Who is online

Users browsing this forum: blue83, mrlegacy83 and 57 guests