1

Тема: AHK: ListLines в реальном времени

Добрый день. Подскажите, есть ли возможность в консоли или где нибудь еще, отображать выполнение скрипта в реальном времени ? Например если добавить команду ListLines, то там будет отображаться выполненные команды на момент открытия, а для дальнейшего отображения надо всегда нажимать "обновить" F5.
Или может есть другие способы посмотреть на выполнение скрипта ? Если я правильно разобрался, то дебагинг в notepad, ahk studio и SciTE4AutoHotkey не подходит, т.к. он делает команду за командой в ручном режиме (надо нажимать все время "след. шаг").

2

Re: AHK: ListLines в реальном времени

Проще всего запустить второй скрипт, который будет за Вас нажимать F5.

3 (изменено: serzh82saratov, 2020-09-09 14:36:01)

Re: AHK: ListLines в реальном времени

Выводит последние 66 строк.


SetTimer, ListLines, 333

loop
{
	If !Mod(A_Index, 4)
		Sleep 1
	Sleep 111
} 

ListLinesOutput(Text) { 
	ToolTip % LastLines(Text, 66), 0, 0, 2
}

LastLines(Haystack, Lines) { 
	If (1, StrReplace(Haystack, "`n", , c)) && (r := c - Lines + 1) > 0
		Haystack := SubStr(Haystack, InStr(Haystack, "`n", , , r) + 1)
	Return Haystack
}

ListLines() {
	Static hwndEdit, pSFW, pSW, bkpSFW, bkpSW
	ListLines Off
	
	if !hwndEdit
	{
		; Retrieve the handle of our main window's Edit control:
		dhw := A_DetectHiddenWindows
		DetectHiddenWindows, On
		Process, Exist
		ControlGet, hwndEdit, Hwnd,, Edit1, ahk_class AutoHotkey ahk_pid %ErrorLevel%
		DetectHiddenWindows, %dhw%
		
		astr := A_IsUnicode ? "astr" : "str"
		hmod := DllCall("GetModuleHandle", "str", "user32.dll")
		; Get addresses of these two functions:
		pSFW := DllCall("GetProcAddress", "uint", hmod, astr, "SetForegroundWindow")
		pSW := DllCall("GetProcAddress", "uint", hmod, astr, "ShowWindow")
		; Make them writable:
		DllCall("VirtualProtect", "uint", pSFW, "uint", 8, "uint", 0x40, "uint*", 0)
		DllCall("VirtualProtect", "uint", pSW, "uint", 8, "uint", 0x40, "uint*", 0)
		; Save initial values of the first 8 bytes:
		bkpSFW := NumGet(pSFW+0, 0, "int64")
		bkpSW := NumGet(pSW+0, 0, "int64")
	}
	
	; Overwrite SetForegroundWindow() and ShowWindow() temporarily:
	NumPut(0x0004C200000001B8, pSFW+0, 0, "int64")  ; return TRUE
	NumPut(0x0008C200000001B8, pSW+0, 0, "int64")   ; return TRUE
	
	; Dump ListLines into hidden AutoHotkey main window:
	ListLines
	
	; Restore SetForegroundWindow() and ShowWindow():
	NumPut(bkpSFW, pSFW+0, 0, "int64")
	NumPut(bkpSW, pSW+0, 0, "int64")
	
	; Retrieve ListLines text and strip out some unnecessary stuff:
	ControlGetText, ListLinesText,, ahk_id %hwndEdit%
	RegExMatch(ListLinesText, ".*`r`n`r`n\K[\s\S]*(?=`r`n`r`n.*$)", ListLinesText)
	StringReplace, ListLinesText, ListLinesText, `r`n, `n, All
	ListLinesOutput(ListLinesText)
	; ListLines On
	; return ListLinesText  ; This line appears in ListLines if we're called more than once.
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

4

Re: AHK: ListLines в реальном времени

Спасибо огромное

serzh82saratov пишет:

Выводит последние 66 строк.


SetTimer, ListLines, 333

loop
{
	If !Mod(A_Index, 4)
		Sleep 1
	Sleep 111
} 

ListLinesOutput(Text) { 
	ToolTip % LastLines(Text, 66), 0, 0, 2
}

LastLines(Haystack, Lines) { 
	If (1, StrReplace(Haystack, "`n", , c)) && (r := c - Lines + 1) > 0
		Haystack := SubStr(Haystack, InStr(Haystack, "`n", , , r) + 1)
	Return Haystack
}

ListLines() {
	Static hwndEdit, pSFW, pSW, bkpSFW, bkpSW
	ListLines Off
	
	if !hwndEdit
	{
		; Retrieve the handle of our main window's Edit control:
		dhw := A_DetectHiddenWindows
		DetectHiddenWindows, On
		Process, Exist
		ControlGet, hwndEdit, Hwnd,, Edit1, ahk_class AutoHotkey ahk_pid %ErrorLevel%
		DetectHiddenWindows, %dhw%
		
		astr := A_IsUnicode ? "astr" : "str"
		hmod := DllCall("GetModuleHandle", "str", "user32.dll")
		; Get addresses of these two functions:
		pSFW := DllCall("GetProcAddress", "uint", hmod, astr, "SetForegroundWindow")
		pSW := DllCall("GetProcAddress", "uint", hmod, astr, "ShowWindow")
		; Make them writable:
		DllCall("VirtualProtect", "uint", pSFW, "uint", 8, "uint", 0x40, "uint*", 0)
		DllCall("VirtualProtect", "uint", pSW, "uint", 8, "uint", 0x40, "uint*", 0)
		; Save initial values of the first 8 bytes:
		bkpSFW := NumGet(pSFW+0, 0, "int64")
		bkpSW := NumGet(pSW+0, 0, "int64")
	}
	
	; Overwrite SetForegroundWindow() and ShowWindow() temporarily:
	NumPut(0x0004C200000001B8, pSFW+0, 0, "int64")  ; return TRUE
	NumPut(0x0008C200000001B8, pSW+0, 0, "int64")   ; return TRUE
	
	; Dump ListLines into hidden AutoHotkey main window:
	ListLines
	
	; Restore SetForegroundWindow() and ShowWindow():
	NumPut(bkpSFW, pSFW+0, 0, "int64")
	NumPut(bkpSW, pSW+0, 0, "int64")
	
	; Retrieve ListLines text and strip out some unnecessary stuff:
	ControlGetText, ListLinesText,, ahk_id %hwndEdit%
	RegExMatch(ListLinesText, ".*`r`n`r`n\K[\s\S]*(?=`r`n`r`n.*$)", ListLinesText)
	StringReplace, ListLinesText, ListLinesText, `r`n, `n, All
	ListLinesOutput(ListLinesText)
	; ListLines On
	; return ListLinesText  ; This line appears in ListLines if we're called more than once.
}

5

Re: AHK: ListLines в реальном времени

serzh82saratov пишет:

Выводит последние 66 строк.

Спасибо за ответ, правда я так и не разобрался как это работает и как это применить.

6

Re: AHK: ListLines в реальном времени

Botsy

Можно установить как запуск по клавише, затем когда нужно отследить, что делает скрипт - нажать эту клавишу и начнётся отображение истории.

7

Re: AHK: ListLines в реальном времени

__Михаил__ пишет:

Botsy

Можно установить как запуск по клавише, затем когда нужно отследить, что делает скрипт - нажать эту клавишу и начнётся отображение истории.

спасибо, разобрался. А можно сделать вывод не поверх всех окон ?


ListLinesOutput(Text) { 
	ToolTip % LastLines(Text, 66), 0, 0, 2
}

вроде надо этот tooltip заменить, только на что ?

8

Re: AHK: ListLines в реальном времени

Botsy

Как вариант - написать Gui окошко и выводить текст в него.