adamb53 Posted May 22, 2013 Share Posted May 22, 2013 (edited) Hello all, I am currently trying to create a script for setup automation, one of the things I want it to do is allow the user to type in the activation key for windows which I will then use to activate windows. My question is, how do I create an input format that is enforced while the user is typing? Example: The user will type their activation key in as such: hgjfkhgjfkhgjfkhgjfkhgjfkhgjfk While the user is typing, dashes will automatically be entered if the user doesn't include them so that when the user is done typing it will actually be: hgjfk-hgjfk-hgjfk-hgjfk-hgjfk I thought to monitor input and every 5 keys to input a dash if the 6th key isn't a dash but I was hoping there would be an easier way? Edited May 22, 2013 by adamb53 Link to comment Share on other sites More sharing options...
UEZ Posted May 22, 2013 Share Posted May 22, 2013 I found this code in my collections (might be "old"): expandcollapse popup;by UEZ #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <Misc.au3> Opt("GUIOnEventMode", 1) $dll = DllOpen("user32.dll") $hGUI = GUICreate("Seriennummer", 232, 90) $input = GUICtrlCreateInput("", 42, 30, 140) $Label = GUICtrlCreateLabel("Format: XXXX-XXXX-XXXX-XXXX", 32, 8, 163, 17) GUICtrlSetLimit($input, 19) $Button = GUICtrlCreateButton("Weiter", 144, 56, 75, 25, $WS_GROUP) GUICtrlSetState(-1, $GUI_DISABLE) GUISetState() $iLen_prev = 0 $iCurPos = 0 GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND') GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") While Sleep(10) $aCaret_pos = WinGetCaretPos() If _IsPressed("25", $dll) Or _IsPressed("26", $dll) Then ;left or up Send("{RIGHT}") ElseIf _IsPressed("27", $dll) Or _IsPressed("28", $dll) Then ;right or down DllCall("User32.dll", 'int', 'SetCaretPos', 'int', $aCaret_pos[0], 'int', $aCaret_pos[1]) EndIf $aPos = GUIGetCursorInfo($hGUI) If $aPos[2] And $aPos[4] = $input Then ControlFocus("", "", $input) Send("{Right 50}") EndIf WEnd Func _Exit() DllClose($dll) Exit EndFunc Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam) If BitAND($wParam, 0x0000FFFF) = $input Then GUICtrlSetData($input, StringUpper(GUICtrlRead($input))) ;upper letters $i = GUICtrlRead($input) $iLen = StringLen($i) + 1 If Mod($iLen, 5) = 0 And $iLen > $iLen_prev And $iLen < 20 Then GUICtrlSetData($input, $i & "-") If Mod($iLen, 5) = 0 And $iLen < $iLen_prev Then GUICtrlSetData($input, StringLeft($i, $iLen - 2)) $iLen_prev = $iLen If $iLen = 20 Then GUICtrlSetState($Button, $GUI_ENABLE) Else GUICtrlSetState($Button, $GUI_DISABLE) EndIf EndIf Return $GUI_RUNDEFMSG EndFunc Br, UEZ Skeletor 1 Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
PhoenixXL Posted May 22, 2013 Share Posted May 22, 2013 Subclassing might be faster expandcollapse popup#include <GUIConstants.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> #include <WinAPI.au3> GUICreate("Test", 500, 200) Global Const $iInput = GUICtrlCreateInput("", 10, 10, 480) GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") GUISetState() Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) $iNotification = _WinAPI_HiWord($wParam) $iControlID = _WinAPI_LoWord($wParam) Switch $iControlID Case $iInput Switch $iNotification Case $EN_CHANGE $s_Text = GUICtrlRead($iControlID) $s_Text = StringRegExpReplace($s_Text, "(-|^)([^\-]{5})([^\-])", "\1\2-\3") $s_Text = StringRegExpReplace($s_Text, "-$", "") GUICtrlSetData($iControlID, $s_Text) EndSwitch EndSwitch EndFunc ;==>WM_COMMAND Do Sleep(10) Until GUIGetMsg() = $GUI_EVENT_CLOSE My code: PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners. MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression. Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted May 22, 2013 Moderators Share Posted May 22, 2013 PhoenixXL, That is not "subclassing" - you do not change the WndProc for the control. is subclassing. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
adamb53 Posted May 22, 2013 Author Share Posted May 22, 2013 Both do exactly what I need Thanks to both of you! I like the second suggestion as it is a lot cleaner but the first has the character limit, I may combine the two so I can implement a character limit as well. Thanks heaps again! Link to comment Share on other sites More sharing options...
PhoenixXL Posted May 22, 2013 Share Posted May 22, 2013 Subclassing might be faster I'm saying the same, Subclassing would be faster than the method I have used. My code: PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners. MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression. Link to comment Share on other sites More sharing options...
Moderators Melba23 Posted May 22, 2013 Moderators Share Posted May 22, 2013 PheonixXL, My apologies, I misunderstood your comment as referring to the code you posted. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area Link to comment Share on other sites More sharing options...
PhoenixXL Posted May 23, 2013 Share Posted May 23, 2013 (edited) I like the second suggestion as it is a lot cleaner but the first has the character limit, I may combine the two so I can implement a character limit as well. I have added a character limit. check the following expandcollapse popup#include <GUIConstants.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> #include <WinAPI.au3> GUICreate("Test", 500, 200) Global Const $iInput = GUICtrlCreateInput("", 10, 10, 480) Global Const $iMinChars = 6 ;the minimum no. of chars after which a dash has to be inserted. Global Const $iMaxDashes = 5 ;this will block the user from entering more chars in the input ;for example if no. of dashes are two there can be maximum only 15 non dash characters. GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") GUISetState() Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) Static $s_InputData_Previous Local $s_Temp $iNotification = _WinAPI_HiWord($wParam) $iControlID = _WinAPI_LoWord($wParam) Switch $iControlID Case $iInput Switch $iNotification Case $EN_CHANGE $s_Text = GUICtrlRead($iControlID) $s_Temp = $s_Text ;store the real data in this var $s_Text = StringReplace($s_Text, "-", "") If StringLen($s_Text) > (($iMaxDashes + 1) * $iMinChars) Then Return GUICtrlSetData($iControlID, $s_InputData_Previous) $s_InputData_Previous = $s_Temp Do $s_Text = StringRegExpReplace($s_Text, "(-|^)([^\-]{" & $iMinChars & "})([^\-])", "\1\2-\3") Until @extended = 0 GUICtrlSetData($iControlID, $s_Text) EndSwitch EndSwitch EndFunc ;==>WM_COMMAND Do Sleep(10) Until GUIGetMsg() = $GUI_EVENT_CLOSE The caret will go to the last char. Let me know if that is a problem. Regards Edited May 23, 2013 by PhoenixXL My code: PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners. MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression. Link to comment Share on other sites More sharing options...
PhoenixXL Posted May 23, 2013 Share Posted May 23, 2013 (edited) Subclassed version. - faster and without any flickers. expandcollapse popup#include <GUIConstants.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> #include <WinAPI.au3> ; ==== User Variables ======== Global Const $iMinChars = 6 ;the minimum no. of chars after which a dash has to be inserted. Global Const $iMaxDashes = 5 ;this will block the user from entering more chars in the input. ;for example if no. of dashes are 2 and minimum no. of chars are 5 there can be maximum only 15 non dash characters. ; ==== User Variables End ==== GUICreate("Test", 500, 200) Global Const $iInput = GUICtrlCreateInput("", 10, 10, 400) Global Const $iChrCode_Dash = 45 ;character code of Dash. Global Const $iChrCode_BackSpace = 08 ;character code of Backspace. ; Unregister, Unsubclass upon Exitting. OnAutoItExitRegister("_AutoExit") ; Register callback function and obtain handle to _New_WndProc. Global $hNew_WndProc = DllCallbackRegister("_New_WndProc", "int", "hwnd;uint;wparam;lparam") ; Get pointer to _New_WndProc Global $pNew_WndProc = DllCallbackGetPtr($hNew_WndProc), $pOld_WndProc = _Edit_SubClass(GUICtrlGetHandle($iInput), $pNew_WndProc) GUISetState() Func _New_WndProc($hWnd, $iMsg, $wParam, $lParam) Switch $iMsg Case $WM_CHAR $iControlID = _WinAPI_GetDlgCtrlID($hWnd) $s_Text = GUICtrlRead($iControlID) ;the characters before the msg was sent Switch $wParam ;character code of the key Case $iChrCode_Dash Return 1 ;block the processing of the Dash Key Case $iChrCode_BackSpace $s_Text = StringTrimRight($s_Text, 1) ;delete the last char. If StringRight($s_Text, 1) = "-" Then $s_Text = StringTrimRight($s_Text, 1) ;if the last char is dash delete it. Case Else ;process the key $s_Text &= ChrW($wParam) EndSwitch $s_Text = StringRegExpReplace($s_Text, "(-|^)([^\-]{" & $iMinChars & "})([^\-])", "\1\2-\3") ;block the processing if limit full If StringLen($s_Text) > (($iMaxDashes + 1) * $iMinChars) + $iMaxDashes Then Return 1 GUICtrlSetData($iControlID, $s_Text) Return 1 ;block the default processing. EndSwitch Return _WinAPI_CallWindowProc($pOld_WndProc, $hWnd, $iMsg, $wParam, $lParam) EndFunc ;==>_New_WndProc Do Sleep(10) Until GUIGetMsg() = $GUI_EVENT_CLOSE Func _AutoExit() ;unsubclass _Edit_SubClass(GUICtrlGetHandle($iInput), $pOld_WndProc) ; Now free created WndProc DllCallbackFree($hNew_WndProc) EndFunc ;==>_AutoExit Func _Edit_SubClass($hWnd, $pNew_WindowProc) Local $iRes = _WinAPI_SetWindowLong($hWnd, -4, $pNew_WindowProc) If @error Then Return SetError(1, 0, 0) If $iRes = 0 Then Return SetError(1, 0, 0) Return SetError(0, 0, $iRes) EndFunc ;==>_Edit_SubClass Edited May 24, 2013 by PhoenixXL My code: PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners. MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression. Link to comment Share on other sites More sharing options...
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