TheAutomator Posted July 30, 2015 Posted July 30, 2015 (edited) Hi everyone ,i'm trying to make some sort of full screen console window where some of the text must be non-editable like windows CMD.exe.Text already typed before pressing enter or the working folder 'C:\...>' is read only in CMD.exe and I want to know if mimicking this behavior in an edit control is possible. My attempt to make a console makes all the [A-Za-z0-9] keys a hotkey and the main edit control is set to read only.Every time the user types something the hotkey function is triggered, the cursor in the edit control is set to the end of the text and the character you typed is added to the edit.If you try to press the {backspace} key when you are at the edge of some text that is read only nothing happens. This works but I guess it is not the best or most clean way to make something like this..Can someone give me some advice or help me make a better function for having full control over text in the edit control? kind regards, TheAutomator expandcollapse popup#include <GuiEdit.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> $Form = GUICreate("Console", @DesktopWidth, @DesktopHeight, 0, 0, BitOR($WS_POPUP, $DS_SETFOREGROUND), $WS_EX_TOPMOST) GUISetBkColor(0x000000) $Console = GUICtrlCreateEdit('Loading...', 32, 32, @DesktopWidth-15, @DesktopHeight - 64, BitOR($ES_READONLY,$WS_VSCROLL), 0) GUICtrlSetFont(-1, 28, 400, 0, 'OCR A Extended') GUICtrlSetColor(-1, 0x00FF00) GUICtrlSetBkColor(-1, 0x000000) GUICtrlSetCursor (-1, 2) _GUICtrlEdit_SetMargins( -1, $EC_RIGHTMARGIN, Default, 49) GUISetState(@SW_SHOW) ;################################################################################################################## Global $keys = 'abcdefghijklmnopqrstuvwxyz _ABCDEFGHIJKLMNOPQRSTUVWXYZ' ;################################################################################################################## For $_ = 1 To StringLen($keys) HotKeySet( StringMid($keys,$_,1), 'keypress') Next For $_ = 0 To 9 HotKeySet($_, 'keypress') HotKeySet('{numpad'&$_&'}', 'keypress') Next HotKeySet('{bs}','Keypress') HotKeySet('{enter}','Enter') _GUICtrlEdit_AppendText($Console, @CRLF&'Type a command:') $MIN = StringLen(GUICtrlRead($Console)) + 1 $MAX = $MIN ;################################################################################################################## Func Keypress() Local $key = @HotKeyPressed If StringLen($key) = 1 Then _GUICtrlEdit_AppendText($Console, $key) $MAX += 1 ElseIf StringRegExp($key,'\{numpad[0-9]\}') Then _GUICtrlEdit_AppendText($Console, StringMid($key,8,1)) $MAX += 1 ElseIf $key = '{bs}' Then If $max = $min then Return Else Local $len = StringLen(GUICtrlRead($Console)) _GUICtrlEdit_SetSel($Console, $len - 1, $len) _GUICtrlEdit_ReplaceSel($Console, '') $MAX -= 1 EndIf EndIf EndFunc Func Enter();handle typed commands when ENTER is pressed: Switch StringStripWS(StringLower(StringMid(GUICtrlRead($Console),$min,$max)),8) Case '' Beep(1000,50) Case 'clear' GUICtrlSetData($Console,'Command:') $MIN = StringLen(GUICtrlRead($Console)) + 1 $MAX = $MIN Return Case 'quit' Quit() Case Else _GUICtrlEdit_AppendText($Console, @CRLF&@TAB&'Unknown command!') EndSwitch _GUICtrlEdit_AppendText($Console, @CRLF&'Type a command:') $MIN = StringLen(GUICtrlRead($Console)) + 1 $MAX = $MIN EndFunc ;============================================================= Func Quit() _GUICtrlEdit_AppendText($Console, @CRLF&@TAB&'Goodbye...') Sleep(1500) Exit EndFunc While True If GUIGetMsg() = $GUI_EVENT_CLOSE Then Quit() EndIf WEnd Edited July 30, 2015 by TheAutomator jvds 1 Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
Developers Jos Posted July 30, 2015 Developers Posted July 30, 2015 Please also read the section in our rules on building a keylogger. This is pretty close to one.Jos SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past.
TheAutomator Posted July 30, 2015 Author Posted July 30, 2015 Please also read the section in our rules on building a keylogger. This is pretty close to one.JosI'm just trying to make a console screen,it would even be better if i don't have to use hotkeys so that the keys are only captured when the edit is visible and active.How can I ask help for making this console without making it look like a key logger? Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
Developers Jos Posted July 30, 2015 Developers Posted July 30, 2015 (edited) I wasn't trying to say you are having malicious intentions because then the thread would have been locked and you would be able to post any more by now. All I am saying is that your posted script looks a lot like it could be used for it so please be careful when posting code in our forums.Jos Edited July 30, 2015 by Jos SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past.
TheAutomator Posted July 30, 2015 Author Posted July 30, 2015 Jos,Ok, no problem. Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
xxaviarxx Posted July 30, 2015 Posted July 30, 2015 I've got a question is this going to be an actual command prompt? If so I have a few ideas and once I go through and edit a few things I'll post them here for you to consider.
TheAutomator Posted July 30, 2015 Author Posted July 30, 2015 xxaviarxx,Its not meant to be an exact copy of Microsoft's command prompt.I want to create custom commands etc.I'm curious about your ideas Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
xxaviarxx Posted July 30, 2015 Posted July 30, 2015 (edited) Custom commands is a great idea but also having the normals of a command prompt are nice features as well.Here is a couple things I've tested :Variable Changes :Global $keys = 'abcdefghijklmnopqrstuvwxyz _ABCDEFGHIJKLMNOPQRSTUVWXYZ-;:/?<>,.`~@$%&*()=}|[]\' & "'" & '"' ; never know what someone may want to try Global $string = "Type a command : " ; reason for this is for a switch you'll see in the next codeKeys i didn't get to work are : ! # ^ + {Change this :_GUICtrlEdit_AppendText($Console, @CRLF&'Type a command:')To this :_GUICtrlEdit_AppendText($Console, @CRLF& $string)lastly add this to/below your Quit case :Case 'quit' or 'exit' Quit() Case 'A:\' or 'A:/' ; lowercase versions too for lazy people $string = "A:\ > " Case 'C:\' or 'C:/' $string = "C:\ > " Case 'D:\' or 'D:/' $string = "D:\ > " Case '/?' or '\?' or '?' or 'help' or 'command' or 'commands' $some variable to hold command list ;then some case to hold descriptions/usages of the commands per command ;i think another switch would work well for thatThat about does it for my ideas so far. edit : If this was Java then id say use a startswith for some of the things that will be needed later on but I'm not sure what autoit has to offer like that. Edited July 30, 2015 by xxaviarxx
iamtheky Posted July 30, 2015 Posted July 30, 2015 I would go with a separate control for input than you do for display, seems like it would make it all much easier. ,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-. |(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/ (_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_) | | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) ( | | | | |)| | \ / | | | | | |)| | `--. | |) \ | | `-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_| '-' '-' (__) (__) (_) (__)
jguinch Posted July 30, 2015 Posted July 30, 2015 I found the idea funny... First attempt :expandcollapse popup#include <GuiEdit.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <WinAPI.au3> Global $prompt = "#Type a command:> " Global $sel, $oldsel, $readonly, $iMinPos, $iStyle Global $Form = GUICreate("Console", @DesktopWidth, @DesktopHeight, 0, 0, BitOR($WS_POPUP, $DS_SETFOREGROUND), $WS_EX_TOPMOST) GUISetBkColor(0x000000) Global $Console = GUICtrlCreateEdit('Loading...', 32, 32, @DesktopWidth-15, @DesktopHeight - 64, $ES_AUTOVSCROLL, 0) GUICtrlSetFont(-1, 12, 400, 0, 'OCR A Extended') GUICtrlSetColor(-1, 0x00FF00) GUICtrlSetBkColor(-1, 0) GUICtrlSetCursor (-1, 2) _GUICtrlEdit_SetMargins( -1, $EC_RIGHTMARGIN, Default, 49) Global $dummy = GUICtrlCreateDummy() Global $aKeys[1][2] = [["{ENTER}", $dummy]] GUISetAccelerators($aKeys) GUISetState(@SW_SHOW) Sleep(1000) _Enter() While True $msg = GUIGetMsg() Switch $msg Case $GUI_EVENT_CLOSE Quit() Case $dummy _Enter() EndSwitch $sel = _GUICtrlEdit_GetSel($Console) If $sel <> $oldsel Then $oldsel = $sel If $sel[0] < $iMinPos Or $sel[1] < $iMinPos Then If NOT $readonly Then GUICtrlSetStyle($Console, $ES_READONLY) $readonly = 1 EndIf Else If $readonly Then $readonly = 0 $iStyle = _WinAPI_GetWindowLong(GUICtrlGetHandle($Console), $GWL_STYLE) GUICtrlSetStyle($Console, BitXOR($iStyle, $ES_READONLY)) EndIf EndIf EndIf WEnd Func Quit() _GUICtrlEdit_AppendText($Console, @CRLF&@TAB&'Goodbye...') Sleep(1500) Exit EndFunc Func _Enter() Local $sCommand = StringRegExp( GUICtrlRead($Console), "\R\Q" & $prompt & "\E\h*(\N*)$|()$", 1)[0] Switch $sCommand Case "clear" GUICtrlSetData($Console, "") Case "quit", "exit" Quit() Case "" Beep(1000,50) Case Else _GUICtrlEdit_AppendText($Console, @CRLF & @TAB & $sCommand & " : command not found") EndSwitch _GUICtrlEdit_AppendText($Console, @CRLF & $prompt) $iMinPos = StringLen(GUICtrlRead($Console) ) EndFunc TheAutomator, abo-krwh and jvds 3 Spoiler Network configuration UDF, _DirGetSizeByExtension, _UninstallList Firefox ConfigurationArray multi-dimensions, Printer Management UDF
TheAutomator Posted July 31, 2015 Author Posted July 31, 2015 xxaviarxx,Thanks for the ideas, I think a simple exec with cmd.exe will give me almost all of the functionality of windows command prompt if I want .I like the $string switch idea btw . boththose,"a separate control for input" and that would be? . jguinch,Brilliant! (noticed a little bug, try to remove the space at the end of "#Type a command:> " and then try to type something.) Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
kylomas Posted July 31, 2015 Posted July 31, 2015 (edited) (noticed a little bug, try to remove the space at the end of "#Type a command:> " and then try to type something.)also problems with the TAB key...Quick impressions:1 - Seems like a combination of the two techniques will work a - hotkey to trap any key that will affect the behavior of the edit control b - regexp to parse the input@xxaviarxx - what is the end game? If your purpose is to try to mimic cmd.exe that has been tried with many issues, search the forum for several examples. If you are trying to create a app/function/command driver of sorts then there is a whole host of issues to consider, among them, console output, command management, possibly security, etc.By the way, I like the gui. Going to use it for the little guessing games that I make for my grandchildren...kylomas Edited July 31, 2015 by kylomas correction TheAutomator 1 Forum Rules Procedure for posting code "I like pigs. Dogs look up to us. Cats look down on us. Pigs treat us as equals." - Sir Winston Churchill
iamtheky Posted July 31, 2015 Posted July 31, 2015 "a separate control for input" and that would be?another edit control strictly for entering commands to the 'console', and then you can take that and send it to run and write it prefaced with whatever you want into the readonly edit control. Much like you see in game console or a chat window. ,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-. |(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/ (_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_) | | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) ( | | | | |)| | \ / | | | | | |)| | `--. | |) \ | | `-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_| '-' '-' (__) (__) (_) (__)
TheAutomator Posted July 31, 2015 Author Posted July 31, 2015 boththose,oh, I thought you meant some other type of control, not a second control.Nah, that's the easy way , that's how I did it in a previous version, it also looks better as it is now. Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
TheAutomator Posted July 31, 2015 Author Posted July 31, 2015 (edited) kylomas,hotkey to trap any key that will affect the behavior of the edit controlThat doesn't work i'm afraid [EDIT:] try $WS_TABSTOPnice to hear you like the old style console look hope your grandchildren have fun with it to Edited July 31, 2015 by TheAutomator Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
TheAutomator Posted July 31, 2015 Author Posted July 31, 2015 I'm gonna modify this a bit further and post the results,thanks for the help guys! Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
kylomas Posted July 31, 2015 Posted July 31, 2015 TheAutomator,I addressed this to the wrong person. It was meant for you.@xxaviarxx - what is the end game? If your purpose is to try to mimic cmd.exe that has been tried with many issues, search the forum for several examples. If you are trying to create a app/function/command driver of sorts then there is a whole host of issues to consider, among them, console output, command management, possibly security, etc. Forum Rules Procedure for posting code "I like pigs. Dogs look up to us. Cats look down on us. Pigs treat us as equals." - Sir Winston Churchill
TheAutomator Posted July 31, 2015 Author Posted July 31, 2015 (edited) TheAutomator,I addressed this to the wrong person. It was meant for you.It's just a funny project, make a full screen console with a custom font and colors, put my own commands in there and add a few tweaks to make it look better.I'm writing a dll that will handle the commands and scripts because I'm making a programming language for it to (so no need for cmd.exe itself),so that I can open my own scripts with that console and see the output, make it a useful tool. a bit like batch-files but my language's syntax will be different.. Edited July 31, 2015 by TheAutomator Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
kylomas Posted July 31, 2015 Posted July 31, 2015 Ambitious project. I'll look forward to seeing the results, if your willing to share.Good Luck,kylomas Forum Rules Procedure for posting code "I like pigs. Dogs look up to us. Cats look down on us. Pigs treat us as equals." - Sir Winston Churchill
jguinch Posted July 31, 2015 Posted July 31, 2015 2nd attempt :expandcollapse popup#include <GuiEdit.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <WinAPI.au3> #include <Array.au3> Global $prompt = "#Type a command :> " Global $sel, $oldsel, $readonly, $iMinPos, $iStyle Global $iFontSize = 12, $sFontName = "OCR A Extended", $iFontcolor = 0x00FF00 Global $Form = GUICreate("Console", @DesktopWidth, @DesktopHeight, 0, 0, BitOR($WS_POPUP, $DS_SETFOREGROUND)) GUISetBkColor(0x000000) Global $Console = GUICtrlCreateEdit('Loading...', 32, 32, @DesktopWidth-15, @DesktopHeight - 64, $ES_AUTOVSCROLL, 0) GUICtrlSetStyle($Console, $ES_READONLY) GUICtrlSetFont(-1, $iFontSize, 400, 0, $sFontName) GUICtrlSetColor(-1, $iFontcolor) GUICtrlSetBkColor(-1, 0) GUICtrlSetCursor (-1, 2) _GUICtrlEdit_SetMargins( -1, $EC_RIGHTMARGIN, Default, 49) Global $dummyEnter = GUICtrlCreateDummy() Global $dummyTab = GUICtrlCreateDummy() Global $dummyBS = GUICtrlCreateDummy() Global $dummyPreviousFunc = GUICtrlCreateDummy() Global $dummyNextFunc = GUICtrlCreateDummy() Global $dummyEsc = GUICtrlCreateDummy() Global $dummyCtrlD = GUICtrlCreateDummy() Global $dummyCtrlC = GUICtrlCreateDummy() Global $aHistory[1], $iIndexFunc = 1 Global $aFunctions = [ ["__clear", "clear,cls"], _ ["__quit", "quit,exit,close"], _ ["__help", "help"] ] _ArraySort($aFunctions) Global $aKeys = [ ["{ENTER}", $dummyEnter], _ ["{TAB}", $dummyTab], _ ["{BACKSPACE}", $dummyBS], _ ["{UP}", $dummyPreviousFunc], _ ["{DOWN}", $dummyNextFunc], _ ["{ESC}", $dummyEsc ], _ ["^d", $dummyCtrlD], _ ["^q", $dummyCtrlD], _ ["^c", $dummyCtrlC] ] GUISetAccelerators($aKeys) GUISetState(@SW_SHOW) Sleep(1000) _Enter() $iStyle = _WinAPI_GetWindowLong(GUICtrlGetHandle($Console), $GWL_STYLE) GUICtrlSetStyle($Console, BitXOR($iStyle, $ES_READONLY)) While True $msg = GUIGetMsg() Switch $msg Case $GUI_EVENT_CLOSE, $dummyCtrlD __Quit() Case $dummyEnter _Enter() Case $dummyBS _BackSpace() Case $dummyPreviousFunc _PreviousFunc() Case $dummyNextFunc _NextFunc() Case $dummyEsc _Esc() Case $dummyCtrlC _CtrlC() EndSwitch $sel = _GUICtrlEdit_GetSel($Console) If $sel <> $oldsel Then $oldsel = $sel If $sel[0] < $iMinPos Or $sel[1] < $iMinPos Then If NOT $readonly Then GUICtrlSetStyle($Console, $ES_READONLY) $readonly = 1 EndIf Else If $readonly Then $readonly = 0 $iStyle = _WinAPI_GetWindowLong(GUICtrlGetHandle($Console), $GWL_STYLE) GUICtrlSetStyle($Console, BitXOR($iStyle, $ES_READONLY)) EndIf EndIf EndIf WEnd Func _CtrlC() _GUICtrlEdit_AppendText($Console, @CRLF & $prompt) $iMinPos = StringLen(GUICtrlRead($Console) ) EndFunc Func _Esc() Local $sCommand = StringRegExp( GUICtrlRead($Console), "\R\Q" & $prompt & "\E\h*(\N*)$|()$", 1)[0] _GUICtrlEdit_SetSel($Console, StringLen(GUICtrlRead($Console)), StringLen(GUICtrlRead($Console)) - StringLen($sCommand) ) _GUICtrlEdit_ReplaceSel($Console, "") EndFunc Func _PreviousFunc() If $iIndexFunc = 1 Then Return $iIndexFunc -= 1 Local $sCommand = StringRegExp( GUICtrlRead($Console), "\R\Q" & $prompt & "\E\h*(\N*)$|()$", 1)[0] _GUICtrlEdit_SetSel($Console, StringLen(GUICtrlRead($Console)), StringLen(GUICtrlRead($Console)) - StringLen($sCommand) ) _GUICtrlEdit_ReplaceSel($Console, $aHistory[$iIndexFunc]) EndFunc Func _NextFunc() If $iIndexFunc = UBound($aHistory) - 1 Then Return $iIndexFunc += 1 Local $sCommand = StringRegExp( GUICtrlRead($Console), "\R\Q" & $prompt & "\E\h*(\N*)$|()$", 1)[0] _GUICtrlEdit_SetSel($Console, StringLen(GUICtrlRead($Console)), StringLen(GUICtrlRead($Console)) - StringLen($sCommand) ) _GUICtrlEdit_ReplaceSel($Console, $aHistory[$iIndexFunc]) EndFunc Func _BackSpace() Local $aSel = _GUICtrlEdit_GetSel($Console) If $aSel[0] = $aSel[1] Then If $aSel[0] > $iMinPos Then _GUICtrlEdit_SetSel($Console, $aSel[0] - 1, $aSel[0]) _GUICtrlEdit_ReplaceSel($Console, "") EndIf Else _GUICtrlEdit_ReplaceSel($Console, "") EndIf EndFunc Func _Enter() Local $iFound = 0 Local $sCommand = StringRegExp( GUICtrlRead($Console), "\R\Q" & $prompt & "\E\h*(\N*)$|()$", 1)[0] If NOT StringRegExp($sCommand, "^\v*$") Then Redim $aHistory[ UBound($aHistory) + 1] $aHistory[ UBound($aHistory) - 1] = $sCommand $iIndexFunc = UBound($aHistory) EndIf For $i = 0 To UBound($aFunctions) - 1 If StringRegExp($sCommand, "^\h*$") Then $iFound = 1 ExitLoop Else If StringRegExp($aFunctions[$i][1], "(?:^|,)" & $sCommand & "(?:,|$)") Then $iFound = 1 GUICtrlSetStyle($Console, $ES_READONLY) Call($aFunctions[$i][0]) $iStyle = _WinAPI_GetWindowLong(GUICtrlGetHandle($Console), $GWL_STYLE) GUICtrlSetStyle($Console, BitXOR($iStyle, $ES_READONLY)) ExitLoop EndIf EndIf Next If NOT $iFound Then _GUICtrlEdit_AppendText($Console, @CRLF & @TAB & $sCommand & " : command not found. Type ""help"" to list the available commands." & @CRLF) _GUICtrlEdit_AppendText($Console, @CRLF & $prompt) $iMinPos = StringLen(GUICtrlRead($Console) ) EndFunc Func __help() Local $command Local $sAlias _GUICtrlEdit_AppendText($Console, @CRLF & "List of available commands : " & @CRLF) For $i = 0 To UBound($aFunctions) - 1 $command = StringRegExpReplace($aFunctions[$i][1], ",\V+", "") $alias = StringRegExpReplace($aFunctions[$i][1], "^.+?,", "") If @extended Then $sAlias = " (alias " & StringReplace($alias, ",", "/") & ")" Else $sAlias = "" EndIf _GUICtrlEdit_AppendText($Console, " " & $command & $sAlias & @CRLF) Next EndFunc Func __clear() GUICtrlSetData($Console, "") EndFunc Func __quit() GUICtrlSetState($Console, $GUI_DISABLE) _GUICtrlEdit_AppendText($Console, @CRLF & @TAB & "Goodbye..." & @CRLF) Sleep(1000) Exit EndFunc iamtheky, TheAutomator and kylomas 3 Spoiler Network configuration UDF, _DirGetSizeByExtension, _UninstallList Firefox ConfigurationArray multi-dimensions, Printer Management UDF
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