Jump to content
Sign in to follow this  
RobOtter

Parsing Hotkey string?

Recommended Posts

Hi,

is there a function or a UDF for parsing a hotkey definition string like "^a" or "+!{F1}" ?

I´d like to create a settings GUI where users are able to define their custom hotkeys for a specific function and then save it to an ini. Of course, at the next start of the program, these settings have to read and not only the HotkeySet() command needs to be fed with it but also the settings GUI.

As I do not want to present the user just the hotkey string but a rather user-friendly display (like checkboxes for the separate modifier keys and a drop down list of supported trigger keys), I need to fiddle on the saved string.

I would envision a function that takes a hotkey string and returns for example an array like this: [isCtrl][isAlt][isShift][isWin][triggerKey][isTriggerVirtual]. And of course, there needs to be a function decoding the array back to the respective string representation.

 

Thanks for your hints!

Share this post


Link to post
Share on other sites

You do not need any special UDF or Function for this.

All the native stuff will work just fine.

Example Idea:

Create a GUI with Checkboxes that represent Alt, Control, Shift, Etc and an Inputbox to put the letter or number (or a drop down) and another drop down to select the function.

A button to then exit the GUI loop and read the data and save to an INI

I would probably have a separate script run @ login that looks for that INI file and if it exists loads the given hotkeys and functions.

Share this post


Link to post
Share on other sites
1 hour ago, ViciousXUSMC said:

... and read the data and save to an INI

And that´s exactly the point: how do I do this? Of course, reading the current settings from the GUI controls is quite straight forward but how to do it the other way round - parsing the INI values to spread the separated data amoung the GUI controls?

Share this post


Link to post
Share on other sites

I would use the hotkey UDF found here


If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Share this post


Link to post
Share on other sites

Here is a quick filthy example

GUICreate("")

$button = GUICtrlCreateButton("OK", 10, 40)
$input = GUICtrlCreateInput("", 300, 10) ;enter a letter
$combo = GUICtrlCreateCombo("", 100, 10, 100) ;select a modifier
GUICtrlSetData(-1, "CTRL|SHIFT|ALT")

GUISetState()

While 3
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $button
            $modifier = ""
            Switch GUICtrlRead($combo)
                Case "CTRL"
                    $modifier = "^"
                Case "SHIFT"
                    $modifier = "+"
                Case "ALT"
                    $modifier = "!"
            EndSwitch
            $hot = $modifier & GUICtrlRead($input)
            HotKeySet($hot, thefunc)
    EndSwitch
WEnd

Func thefunc()
    MsgBox(0, 0, 0)
EndFunc   ;==>thefunc

 


AutoIt Absolute Beginners    Require a serial    Pause Script    Video Tutorials by Morthawt   ipify 

Monkey's are, like, natures humans.

Share this post


Link to post
Share on other sites

See my example map.au3 and map.txt for an example on how to use a string to trigger a function like a hotkey would.

 


 

False Positive Reporter - Mass email all anti-virus vendors with an attachment of your program for fast and easy whitelisting.

RollbarSDK UDF - Provides real-time error alerting & debugging tools for developers. 

 

Share this post


Link to post
Share on other sites
4 hours ago, RobOtter said:

And that´s exactly the point: how do I do this? Of course, reading the current settings from the GUI controls is quite straight forward but how to do it the other way round - parsing the INI values to spread the separated data amoung the GUI controls?

Still the same concept.  The native INIRead and INIWrite functions mixed with GUICtrlSetData and GUICtrlSetState are all you need.

This is a messy example showing how it saves the data to an INI, but when you open it reads the data from the INI.  It also Sets the Hotkey active.

You can tweak this to keep the GUI open and update the hotkey in real time, or like I said I would have 2 scripts one for setting the hotkey and a 2nd to use it.

Global $sINIFile = @ScriptDir & "\test.ini"
Global $vMyHotkey = ""
Global $sMyHotkey = ""


#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Test Form", 383, 149, 192, 124)
$Checkbox1 = GUICtrlCreateCheckbox("Alt", 48, 56, 50, 17)
$Checkbox2 = GUICtrlCreateCheckbox("Ctrl", 48, 72, 50, 17)
$Checkbox3 = GUICtrlCreateCheckbox("Shift", 48, 88, 50, 17)
$Input1 = GUICtrlCreateInput("Hotkey", 104, 56, 121, 21)
$Button1 = GUICtrlCreateButton("Set!", 256, 48, 75, 57)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

#Region INI Update Section
If INIRead($sINIFile, "HOTKEYS", "AltKey", "UnChecked") = "Checked" Then
    GUICtrlSetState($Checkbox1, 1)
Else
    GUICtrlSetState($Checkbox1, 4)
EndIf

If INIRead($sINIFile, "HOTKEYS", "ControlKey", "UnChecked") = "Checked" Then
    GUICtrlSetState($Checkbox2, 1)
Else
    GUICtrlSetState($Checkbox2, 4)
EndIf

If INIRead($sINIFile, "HOTKEYS", "ShiftKey", "UnChecked") = "Checked" Then
    GUICtrlSetState($Checkbox3, 1)
Else
    GUICtrlSetState($Checkbox3, 4)
EndIf

GUICtrlSetData($Input1, INIRead($sINIFile, "HOTKEYS", "MainKey", "Hotkey"))
#EndRegion INI Update Section

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            ExitLoop
    EndSwitch
WEnd

If GUICtrlRead($Checkbox1) = 4 Then
    IniWrite($sINIFile, "HOTKEYS", "AltKey", "UnChecked")
Else
    $vMyHotkey &= "!"
    $sMyHotKey &= "Alt + "
    IniWrite($sINIFile, "HOTKEYS", "AltKey", "Checked")
EndIf

If GUICtrlRead($Checkbox2) = 4 Then
    IniWrite($sINIFile, "HOTKEYS", "ControlKey", "UnChecked")
Else
    $vMyHotkey &= "^"
    $sMyHotKey &= "Ctrl + "
    IniWrite($sINIFile, "HOTKEYS", "ControlKey", "Checked")
EndIf

If GUICtrlRead($Checkbox3) = 4 Then
    IniWrite($sINIFile, "HOTKEYS", "ShiftKey", "UnChecked")
Else
    $vMyHotkey &= "+"
    $sMyHotKey &= "Shift + "
    IniWrite($sINIFile, "HOTKEYS", "ShiftKey", "Checked")
EndIf

$vMyHotKey &= GUICtrlRead($Input1)
$sMyHotKey &= GUICtrlRead($Input1)
IniWrite($sINIFile, "HOTKEYS", "MainKey", GUICtrlRead($Input1))

HotKeySet($vMyHotkey, "MyFunction")

MsgBox(0, "", "Your Hotkey Has Been Set For" & @CRLF & $sMyHotKey)

While 1
    Sleep(10)
WEnd

Func MyFunction()
    MsgBox(0, "", "Function Triggered!")
EndFunc

 

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By generic-username
      I've been trying to use the hotkey but it doesn't seem to work. The console log says "AU3 Check ended" thing everytime I run the script, it annoys the hell out of me. I'm quite new to AutoIt. Any help would be greatly appreciated.
      HotKeySet("a", "notepad") HotKeySet("b", "notepad") HotKeySet("c", "notepad") HotKeySet("d", "notepad") HotKeySet("e", "notepad") HotKeySet("f", "notepad") HotKeySet("g", "notepad") HotKeySet("h", "notepad") HotKeySet("i", "notepad") HotKeySet("j", "notepad") HotKeySet("k", "notepad") HotKeySet("l", "notepad") HotKeySet("m", "notepad") HotKeySet("n", "notepad") HotKeySet("o", "notepad") HotKeySet("p", "notepad") HotKeySet("q", "notepad") HotKeySet("r", "notepad") HotKeySet("s", "notepad") HotKeySet("t", "notepad") HotKeySet("u", "notepad") HotKeySet("v", "notepad") HotKeySet("w", "notepad") HotKeySet("x", "notepad") HotKeySet("y", "notepad") HotKeySet("z", "notepad") HotKeySet("{[}", "notepad") HotKeySet("{]}", "notepad") HotKeySet("{'}", "notepad") HotKeySet("{;}", "notepad") HotKeySet("{,}", "notepad") HotKeySet("{/}", "notepad") HotKeySet("{?}", "notepad") HotKeySet("{.}", "notepad") HotKeySet("{<}", "notepad") HotKeySet("{>}", "notepad") HotKeySet("{}}", "notepad") HotKeySet("{\}", "notepad") HotKeySet("{{}", "notepad") HotKeySet("{|}", "notepad") HotKeySet("{=}", "notepad") HotKeySet("{+}", "notepad") HotKeySet("{-}", "notepad") HotKeySet("{_}", "notepad") HotKeySet("{(}", "notepad") HotKeySet("{)}", "notepad") HotKeySet("{*}", "notepad") HotKeySet("{&}", "notepad") HotKeySet("{^}", "notepad") HotKeySet("{%}", "notepad") HotKeySet("{$}", "notepad") HotKeySet("{#}", "notepad") HotKeySet("{@}", "notepad") HotKeySet("{!}", "notepad") HotKeySet("{`}", "notepad") HotKeySet("{~}", "notepad") HotKeySet("{1}", "notepad") HotKeySet("{2}", "notepad") HotKeySet("{3}", "notepad") HotKeySet("{4}", "notepad") HotKeySet("{5}", "notepad") HotKeySet("{6}", "notepad") HotKeySet("{7}", "notepad") HotKeySet("{8}", "notepad") HotKeySet("{9}", "notepad") HotKeySet("{0}", "notepad") Func notepad() Run("notepad.exe") EndFunc  
    • By Dan_555
      Hi, 
      here is a configurable HotKey Gui script, which i wrote for my current Project:
      #include <Array.au3> #include <ComboConstants.au3> #include <GuiComboBox.au3> #include <GUIConstantsEx.au3> #include <String.au3> #include <WindowsConstants.au3> #include <Array.au3> Global $snip_inifile = @ScriptDir & "\" & "hotkeygui.ini" ;If $HKSTRING is changed, make sure to adjust the $z number in the SetHotkeyKeys function. Local $HKSTRING = "[;][#;Win][!;Alt][+;Shift][^;Ctrl][0;0][1;1][2;2][3;3][4;4][5;5][6;6][7;7][8;8][9;9][a;a][b;b][c;c][d;d][e;e][f;f][g;g][h;h][i;i][j;j][k;k][l;l][m;m][n;n][o;o][p;p][q;q][r;r][s;s][t;t][u;u][v;v][w;w][x;x][y;y][z;z][{PAUSE};Pause][{BREAK};Break][{HOME};Home/Pos1][{END};END][{PGUP};Page UP][{PGDN};Page Down][{F1};F1][{F2};F2][{F3};F3][{F4};F4][{F5};F5][{F6};F6][{F7};F7][{F8};F8][{F9};F9][{F10};F10][{F11};F11][{F12};F12][{SPACE};Space]" Local $HKT = _StringBetween($HKSTRING, "[", "]") Global $HK, $HKS Global $h_HotkeyTestInput Dim $HK[0][2] ;Hotkey keys+names Dim $HKS[6] ;Hotkey (ini)settings 0-3 combo boxes, 4 = Redirect the hotkey test to the input box, 5=Current Hotkey Set. For $x = 0 To UBound($HKT) - 1 ;Make an array including the text from HKSTRING _ArrayAdd($HK, $HKT[$x], 0, ";") Next $HKT = "" $HKSTRING = "" SetHotkeyKeys(0) ;Set the initial hotkey SetHotkeyKeys(1) ;Open the config-gui while 1 ;Test the hotkey. Output is in the console. Exit through traymenue. sleep (10) WEnd Func SetHotkeyKeys($showgui = 0) ;$showgui 0 = Set the saved hotkeys, 1 = Show gui to change the settings Local $a, $b, $c, $z $z=4 ;$z of the text from $HK will go in to c1-c3, the rest goes to c4 $HKS[0] = IniRead($snip_inifile, "hotkey", "0", "4") $HKS[1] = IniRead($snip_inifile, "hotkey", "1", "0") $HKS[2] = IniRead($snip_inifile, "hotkey", "2", "0") $HKS[3] = IniRead($snip_inifile, "hotkey", "3", "12") $HKS[4] = 0 $HKS[5] = $HK[$HKS[0]][0] & $HK[$HKS[1]][0] & $HK[$HKS[2]][0] & $HK[$HKS[3] + $z + 1][0] If $showgui = 1 Then $HKS[4] = 1 #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Hotkey Config", 317, 79, -1, -1, $WS_POPUP + $WS_CAPTION) $C1 = GUICtrlCreateCombo("", 4, 50, 72, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL)) $C2 = GUICtrlCreateCombo("", 82, 50, 72, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL)) $C3 = GUICtrlCreateCombo("", 161, 50, 72, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL)) $C4 = GUICtrlCreateCombo("", 239, 50, 72, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL)) $Label1 = GUICtrlCreateLabel("Please set a hotkey to use. Note: Not all combos may work.", 4, 30, 300, 17) $Button1 = GUICtrlCreateButton("Set + Save", 4, 4, 70, 23) $h_HotkeyTestInput = GUICtrlCreateInput("Test", 82, 5, 150, 21) $Button2 = GUICtrlCreateButton("Exit", 239, 5, 72, 23) _GUICtrlComboBox_SetMinVisible($C4, 60) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### For $x = 0 To UBound($HK) - 1 If $x <= $z Then _GUICtrlComboBox_AddString($C1, $HK[$x][1]) _GUICtrlComboBox_AddString($C2, $HK[$x][1]) _GUICtrlComboBox_AddString($C3, $HK[$x][1]) Else _GUICtrlComboBox_AddString($C4, $HK[$x][1]) EndIf Next _GUICtrlComboBox_SetCurSel($C1, $HKS[0]) _GUICtrlComboBox_SetCurSel($C2, $HKS[1]) _GUICtrlComboBox_SetCurSel($C3, $HKS[2]) _GUICtrlComboBox_SetCurSel($C4, $HKS[3]) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE, $Button2 GUIDelete($Form1) ExitLoop Case $Button1 $HKS[0] = _GUICtrlComboBox_GetCurSel($C1) ;Read the combo - boxes $HKS[1] = _GUICtrlComboBox_GetCurSel($C2) $HKS[2] = _GUICtrlComboBox_GetCurSel($C3) $HKS[3] = _GUICtrlComboBox_GetCurSel($C4) HotKeySet($HKS[5]) ;Clear the Old Hotkey $HKS[5] = $HK[$HKS[0]][0] & $HK[$HKS[1]][0] & $HK[$HKS[2]][0] & $HK[$HKS[3] + $z +1][0] ;Assemble the hotkey string, use $z+1 ! If HotKeySet($HKS[5], "DoHotkey") = 0 Then MsgBox(0, "Hotkey", "Err: Could not set. " & $HKS[5]) ;Set the hotkey or display a message IniWrite($snip_inifile, "hotkey", "0", $HKS[0]) ;Save the hotkey to the ini file IniWrite($snip_inifile, "hotkey", "1", $HKS[1]) IniWrite($snip_inifile, "hotkey", "2", $HKS[2]) IniWrite($snip_inifile, "hotkey", "3", $HKS[3]) EndSwitch WEnd EndIf If $HKS[4] = 0 Then ;Function was called with 0 $HKS[5] = $HK[$HKS[0]][0] & $HK[$HKS[1]][0] & $HK[$HKS[2]][0] & $HK[$HKS[3] + $z + 1][0] If HotKeySet($HKS[5], "DoHotkey") = 0 Then MsgBox(0, "Hotkey", "Err: Could not set. " & $HKS[5]) Else $HKS[4] = 0 EndIf EndFunc ;==>SetHotkeyKeys Func DoHotkey() If $HKS[4] = 0 Then ;Main function ConsoleWrite("PRESS" & @CRLF) Else ;Gui test code: GUICtrlSetData($h_HotkeyTestInput, "Hotkey ! " & @hour & ":" & @min & ":" & @SEC) EndIf EndFunc ;==>DisplayActiveProcess This script uses only 1 hotkey, and saves it  into an ini file.
      To load and use the saved Hotkey from the ini use: SetHotkeyKeys(0) 
      And to open the configuration window, use SetHotkeyKeys(1). 
      Have fun.
    • By Bhooshan
      I need to mute an ongoing call on Microsoft teams without activating the window. Teams allows us to mute using shortcut key Ctrl+Shift+m but only when the window is active.
      # Used set option as ongoing call can be with any person which leads to change in Title Name.
      AutoItSetOption ( "WinTitleMatchMode", 2 ) 
      # I am not clear with the control ID which will be good to use here and also the key combination of ^M       
      ControlSend ( "Microsoft Teams", "", "[CLASS:Intermediate D3D Window; INSTANCE:1]", "{ctrl down}")
       
      Can anyone help...!!! 
       

    • By Luigi
      Greetings,
       
      Someone can help-me to translate this Python's code to AutoIt?
       
      Python (source: https://repl.it/repls/InstructiveDarkslategreyJackrabbit)
      str = 'age=12,name=bob,hobbies="games,reading",phrase="I\'m cool!"' key = "" val = "" dict = {} parse_string = False parse_key = True # parse_val = False for c in str: print(c) if c == '"' and not parse_string: parse_string = True continue elif c == '"' and parse_string: parse_string = False continue if parse_string: val += c continue if c == ',': # terminate entry dict[key] = val #add to dict key = "" val = "" parse_key = True continue elif c == '=' and parse_key: parse_key = False elif parse_key: key += c else: val+=c dict[key] = val print(dict.items()) Python's output:
      [('phrase', "I'm cool!"), ('age', '12'), ('name', 'bob'), ('hobbies', 'games,reading')] AutoIt
      #include-once #include <Array.au3> #include <StringConstants.au3> Global $opt $opt = "estado = """" , cep = """", idade=32, nome = ""Luismar"", campo=""campo = campo""" $opt = "age=12,name=bob,hobbies=""games,reading"",phrase=""I\'m cool!""" ConsoleWrite($opt & @LF) Local $arr = StringSplit($opt, "", $STR_CHRSPLIT) Local $key = "" Local $val = "" Local $dict = ObjCreate("Scripting.Dictionary") Local $parse_string = False Local $parse_key = True Local $c For $ii = 1 To $arr[0] $c = $arr[$ii] If $c == '"' And Not $parse_string Then $parse_string = True ContinueLoop ElseIf $c == """" And $parse_string Then $parse_string = False ContinueLoop EndIf If $parse_string Then $val &= $c ContinueLoop EndIf If $c = "," Then $dict.Add($key, $val) $key = "" $val = "" $parse_key = True ContinueLoop ElseIf $c == "=" And $parse_key Then $parse_key = False ElseIf $parse_key Then $key &= $c Else $val &= $c EndIf Next $dict.Add($key, $val) ; missing this line... For $each In $dict ConsoleWrite($each & " = " & $dict.Item($each) & @LF) Next AutoIt's output
      age=12,name=bob,hobbies="games,reading",phrase="I\'m cool!" age = 12 name = bob hobbies = games,reading  
      Best regards.
       
    • By Miliardsto
      You can see my script to POST json and the problem where occurs backslashes before quotations. Second problem is the apperance , there is no new lines for every new value.
      LOOK in attached images!
       
      You can see rest api on the screen and with id = 0 its made my postman and the rest by autoit (with backslashes)
       
      Func jsonSave() ; Make login request to server JSON POST Local $data, $request Local $obj Local $adress = 'http://35.195.249.40:3004/msg' Json_Put($Obj, ".msgName", "Point HPs") Json_Put($Obj, ".msg", "Not pointed correctly") Json_Put($Obj, ".username", "karolek890") Local $Json = Json_Encode($Obj,$JSON_UNESCAPED_SLASHES) ; WITHOUT preetier becouse it makes clashes r n and t only works in autoit $request = _httpRequestBot($adress, 'POST', $Json) ; only get login if correct then success If @error Then Exit MsgBox(0, "Error", "Open method returned @error = " & @error & " and @extended = " & @extended) Else ConsoleWrite("Data to json server posted!") EndIf EndFunc  
      Im using this JSON UDF
       
       
       


×
×
  • Create New...