wolstech Posted November 8, 2017 Posted November 8, 2017 (edited) So, I have a program that reads the STDOUT of from an application I did not make (a coin miner), watches for certain events, and also prints the application's output back to the screen. The miner program uses ANSI color codes to produce a pretty output, which I'd like to retain, but if I ConsoleWrite() the data I grabbed from STDOUT back to the screen, the "escape character" (first character of the ANSI code) is malformed and causes the ANSI code to not work, resulting in the codes appearing as text in the console window. I can't get ANSI codes to work at all through ConsoleWrite() actually. Is there a way to do this? If not, what's the quickest way to strip all ANSI codes from the stream so they don't clutter the output? Even an example script with an ANSI code doesn't work: #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Change2CUI=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #NoTrayIcon ; the character before the [ is supposed to be an ESC character. Neither of the below produce desired output. ConsoleWrite("�[0;36m This should be in Cyan"&@LF) ConsoleWrite(Chr(27) & "[0;36m This should be in Cyan"&@LF) Sleep(1000) Exit (Program needs to be compiled and run in a command prompt, I know SciTe doesn't support it) Edited November 8, 2017 by wolstech
argumentum Posted November 9, 2017 Posted November 9, 2017 (edited) On 11/8/2017 at 3:56 PM, wolstech said: (Program needs to be compiled and run in a command prompt Expand https://msdn.microsoft.com/en-us/library/cc722862.aspxhttp://www.nivot.org/blog/post/2016/02/04/Windows-10-TH2-(v1511)-Console-Host-Enhancements?_ga=2.193292525.178267082.1510198526-480092871.1510198525https://conemu.github.io/en/ Good luck with that Edited November 9, 2017 by argumentum Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting.
Gianni Posted November 13, 2017 Posted November 13, 2017 you could embed in your gui a Browsercontrol equipped with a javascript xterminal component capable of correctly manage ANSI control codes. Then you could send to it the stdout of your coin miner application here is a quick (and dirty) example on how to setup the stuff. (It should download the needed components automatically to the script path) expandcollapse popupGlobal $ohJS _JS_Environment() ; setup the Javascript environment and the xterm component to be used within AutoIt; ; the character before the [ is supposed to be an ESC character $ohJS.term.write("[0;36m This should be in Cyan" & @CRLF) $ohJS.term.write(Chr(27) & "[0;36m This should be in Cyan" & @CRLF & @CRLF & @CRLF) For $i = 30 To 37 $ohJS.term.write(Chr(27) & "[0;" & $i & "m sample text" & @TAB & Chr(27) & "[1;" & $i & "m sample text" & @TAB & Chr(27) & "[0;" & $i + 10 & "m sample text" & @CRLF) Next MsgBox(0, "Debug", "Pause") ; a sample of ANSI artwork downloaded from here http://artscene.textfiles.com/ansi/ $sURL = "http://artscene.textfiles.com/ansi/artwork/face_2.ans" $sANSI = BinaryToString(InetRead($sURL)) $ohJS.term.write($sANSI) MsgBox(0, "Debug", "The end") Func _JS_Environment() ; setup Javascript engine with the "xTerm" library embeded _CheckDependencies() ; check the presence of needed files and download if necessary ; *** create an 'html' page listing for the browser Local $sHTML = "<!DOCTYPE html>" & @CRLF $sHTML &= "<HTML><HEAD>" & @CRLF $sHTML &= '<meta http-equiv="X-UA-Compatible" content="IE=edge" />' & @CRLF $sHTML &= '<link rel="stylesheet" href="' & @ScriptDir & '\xterm.css" />' & @CRLF $sHTML &= "<script>" & @CRLF ; Javascripts goes here $sHTML &= 'var JSglobal = (1,eval)("this");' & @CRLF ; the 'JSglobal' variable gets an handle to the javascript global object $sHTML &= "</script>" & @CRLF $sHTML &= '<script src="' & @ScriptDir & '\xterm.js"></script>' & @CRLF $sHTML &= '<script src="' & @ScriptDir & '\fit.js"></script>' & @CRLF $sHTML &= "</HEAD>" & @CRLF $sHTML &= "<body>" & @CRLF $sHTML &= '<div id="xterminal" style="position:absolute;' & @CRLF $sHTML &= " top:3px;" & @CRLF $sHTML &= " left:3px;" & @CRLF $sHTML &= " width:794px;" & @CRLF $sHTML &= " height:494px;" & @CRLF $sHTML &= ' margin: 0px 0px 0px 0px">' & @CRLF $sHTML &= "</div>" & @CRLF $sHTML &= " <script>" & @CRLF $sHTML &= " var term = new Terminal();" & @CRLF $sHTML &= " term.open(document.getElementById('xterminal'));" & @CRLF $sHTML &= " term.fit();" & @CRLF $sHTML &= " </script>" & @CRLF $sHTML &= "</body>" & @CRLF $sHTML &= "</HTML>" & @CRLF ; html closing tags ; *** end of html page listing $oIE = ObjCreate("Shell.Explorer.2") ; a BrowserControl GUICreate("", 800, 500, 10, 10) ; place the gui on screen GUICtrlCreateObj($oIE, 0, 0, 800, 500) ; embed and render $oIE usable GUISetState(@SW_SHOW) ; show the GUI $oIE.navigate('about:blank') While Not String($oIE.readyState) = 'complete' ; wait for about:blank Sleep(100) WEnd ; this waits till the document is ready to be used (portion of code from IE.au3) While Not (String($oIE.document.readyState) = "complete" Or $oIE.document.readyState = 4) Sleep(100) WEnd $oIE.document.Write($sHTML) ; inject lising directly to the HTML document: $oIE.document.close() ; close the write stream $oIE.document.execCommand("Refresh") ; this waits till the injected page is ready While Not String($oIE.readyState) = 'complete' Sleep(100) WEnd ; https://msdn.microsoft.com/en-us/library/52f50e9t(v=vs.94).aspx $ohJS = $oIE.document.parentwindow.JSglobal ; $ohJS is a reference to the javascript Global Obj ; now the javascript engine and loaded modules can be used in our AutoIt script using the $ohJS reference EndFunc ;==>_JS_Environment Func _CheckDependencies() Local $iCheck = 0 $iCheck += FileExists(@ScriptDir & '\xterm.js') $iCheck += FileExists(@ScriptDir & '\xterm.css') $iCheck += FileExists(@ScriptDir & '\fit.js') ConsoleWrite("Debug check: " & $iCheck & @CRLF) If $iCheck <> 3 Then InetGet("https://github.com/xtermjs/xterm.js/archive/2.9.2.zip", "2.9.2.zip") _Unzip(@ScriptDir & '\2.9.2.zip', @ScriptDir, 'xterm.js-2.9.2\dist\xterm.js') _Unzip(@ScriptDir & '\2.9.2.zip', @ScriptDir, 'xterm.js-2.9.2\dist\xterm.css') _Unzip(@ScriptDir & '\2.9.2.zip', @ScriptDir, 'xterm.js-2.9.2\dist\addons\fit\fit.js') EndIf EndFunc ;==>_CheckDependencies ; https://www.experts-exchange.com/questions/26321098/How-to-unzip-a-single-file-from-a-zipped-subdirectory.html Func _Unzip($sZIPfile, $sDestFolder, $sSingleFileName = '') Local $oApp = ObjCreate("Shell.Application") If $sSingleFileName <> "" Then $oApp.Namespace($sDestFolder).CopyHere($oApp.Namespace($sZIPfile).Items.item($sSingleFileName)) Else $oApp.Namespace($sDestFolder).CopyHere($oApp.Namespace($sZIPfile).Items) EndIf EndFunc ;==>_Unzip have a look to following links for a better use:https://github.com/xtermjs/xterm.jshttps://xtermjs.org/docs/ Chimp small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now