├── .gitignore ├── example └── main.go ├── keys_darwin.go ├── keys_linux.go ├── keys_windows.go ├── readme.md └── string2keyboard.go /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode/ -------------------------------------------------------------------------------- /example/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "fmt" 6 | "os" 7 | "strings" 8 | "time" 9 | 10 | "github.com/taglme/string2keyboard" 11 | ) 12 | 13 | func main() { 14 | 15 | fmt.Print("Enter text to write as keyboard input: ") 16 | reader := bufio.NewReader(os.Stdin) 17 | text, _ := reader.ReadString('\n') 18 | text = strings.Trim(text, "\n") 19 | fmt.Println("Select text input field to write. Wait 5 sec to start writting...") 20 | time.Sleep(5 * time.Second) 21 | err := string2keyboard.KeyboardWrite(text) 22 | if err != nil { 23 | fmt.Printf("Could not write as keyboard input. Error: %s", err.Error()) 24 | } else { 25 | fmt.Println("Success!") 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /keys_darwin.go: -------------------------------------------------------------------------------- 1 | package string2keyboard 2 | 3 | import "github.com/micmonay/keybd_event" 4 | 5 | var ( 6 | names = map[string]keySet{ 7 | "a": keySet{keybd_event.VK_A, false}, 8 | "b": keySet{keybd_event.VK_B, false}, 9 | "c": keySet{keybd_event.VK_C, false}, 10 | "d": keySet{keybd_event.VK_D, false}, 11 | "e": keySet{keybd_event.VK_E, false}, 12 | "f": keySet{keybd_event.VK_F, false}, 13 | "g": keySet{keybd_event.VK_G, false}, 14 | "h": keySet{keybd_event.VK_H, false}, 15 | "i": keySet{keybd_event.VK_I, false}, 16 | "j": keySet{keybd_event.VK_J, false}, 17 | "k": keySet{keybd_event.VK_K, false}, 18 | "l": keySet{keybd_event.VK_L, false}, 19 | "m": keySet{keybd_event.VK_M, false}, 20 | "n": keySet{keybd_event.VK_N, false}, 21 | "o": keySet{keybd_event.VK_O, false}, 22 | "p": keySet{keybd_event.VK_P, false}, 23 | "q": keySet{keybd_event.VK_Q, false}, 24 | "r": keySet{keybd_event.VK_R, false}, 25 | "s": keySet{keybd_event.VK_S, false}, 26 | "t": keySet{keybd_event.VK_T, false}, 27 | "u": keySet{keybd_event.VK_U, false}, 28 | "v": keySet{keybd_event.VK_V, false}, 29 | "w": keySet{keybd_event.VK_W, false}, 30 | "x": keySet{keybd_event.VK_X, false}, 31 | "y": keySet{keybd_event.VK_Y, false}, 32 | "z": keySet{keybd_event.VK_Z, false}, 33 | 34 | "A": keySet{keybd_event.VK_A, true}, 35 | "B": keySet{keybd_event.VK_B, true}, 36 | "C": keySet{keybd_event.VK_C, true}, 37 | "D": keySet{keybd_event.VK_D, true}, 38 | "E": keySet{keybd_event.VK_E, true}, 39 | "F": keySet{keybd_event.VK_F, true}, 40 | "G": keySet{keybd_event.VK_G, true}, 41 | "H": keySet{keybd_event.VK_H, true}, 42 | "I": keySet{keybd_event.VK_I, true}, 43 | "J": keySet{keybd_event.VK_J, true}, 44 | "K": keySet{keybd_event.VK_K, true}, 45 | "L": keySet{keybd_event.VK_L, true}, 46 | "M": keySet{keybd_event.VK_M, true}, 47 | "N": keySet{keybd_event.VK_N, true}, 48 | "O": keySet{keybd_event.VK_O, true}, 49 | "P": keySet{keybd_event.VK_P, true}, 50 | "Q": keySet{keybd_event.VK_Q, true}, 51 | "R": keySet{keybd_event.VK_R, true}, 52 | "S": keySet{keybd_event.VK_S, true}, 53 | "T": keySet{keybd_event.VK_T, true}, 54 | "U": keySet{keybd_event.VK_U, true}, 55 | "V": keySet{keybd_event.VK_V, true}, 56 | "W": keySet{keybd_event.VK_W, true}, 57 | "X": keySet{keybd_event.VK_X, true}, 58 | "Y": keySet{keybd_event.VK_Y, true}, 59 | "Z": keySet{keybd_event.VK_Z, true}, 60 | 61 | "0": keySet{keybd_event.VK_0, false}, 62 | "1": keySet{keybd_event.VK_1, false}, 63 | "2": keySet{keybd_event.VK_2, false}, 64 | "3": keySet{keybd_event.VK_3, false}, 65 | "4": keySet{keybd_event.VK_4, false}, 66 | "5": keySet{keybd_event.VK_5, false}, 67 | "6": keySet{keybd_event.VK_6, false}, 68 | "7": keySet{keybd_event.VK_7, false}, 69 | "8": keySet{keybd_event.VK_8, false}, 70 | "9": keySet{keybd_event.VK_9, false}, 71 | " ": keySet{keybd_event.VK_SPACE, false}, 72 | 73 | ")": keySet{keybd_event.VK_0, true}, 74 | "!": keySet{keybd_event.VK_1, true}, 75 | "@": keySet{keybd_event.VK_2, true}, 76 | "#": keySet{keybd_event.VK_3, true}, 77 | "$": keySet{keybd_event.VK_4, true}, 78 | "%": keySet{keybd_event.VK_5, true}, 79 | "^": keySet{keybd_event.VK_6, true}, 80 | "&": keySet{keybd_event.VK_7, true}, 81 | "*": keySet{keybd_event.VK_8, true}, 82 | "(": keySet{keybd_event.VK_9, true}, 83 | 84 | "-": keySet{keybd_event.VK_MINUS, false}, 85 | "=": keySet{keybd_event.VK_EQUAL, false}, 86 | "[": keySet{keybd_event.VK_LeftBracket, false}, 87 | "]": keySet{keybd_event.VK_RightBracket, false}, 88 | "\\": keySet{keybd_event.VK_BACKSLASH, false}, 89 | ";": keySet{keybd_event.VK_SEMICOLON, false}, 90 | "'": keySet{keybd_event.VK_Quote, false}, 91 | ",": keySet{keybd_event.VK_COMMA, false}, 92 | ".": keySet{keybd_event.VK_Period, false}, 93 | "/": keySet{keybd_event.VK_SLASH, false}, 94 | "`": keySet{keybd_event.VK_GRAVE, false}, 95 | 96 | "_": keySet{keybd_event.VK_MINUS, true}, 97 | "+": keySet{keybd_event.VK_EQUAL, true}, 98 | "{": keySet{keybd_event.VK_LeftBracket, true}, 99 | "}": keySet{keybd_event.VK_RightBracket, true}, 100 | "|": keySet{keybd_event.VK_BACKSLASH, true}, 101 | ":": keySet{keybd_event.VK_SEMICOLON, true}, 102 | "\"": keySet{keybd_event.VK_Quote, true}, 103 | "<": keySet{keybd_event.VK_COMMA, true}, 104 | ">": keySet{keybd_event.VK_Period, true}, 105 | "?": keySet{keybd_event.VK_SLASH, true}, 106 | "~": keySet{keybd_event.VK_GRAVE, true}, 107 | 108 | "ENTER": keySet{keybd_event.VK_ENTER, false}, 109 | "TAB": keySet{keybd_event.VK_TAB, false}, 110 | "BACKSPACE": keySet{keybd_event.VK_DELETE, false}, 111 | } 112 | ) 113 | -------------------------------------------------------------------------------- /keys_linux.go: -------------------------------------------------------------------------------- 1 | package string2keyboard 2 | 3 | import "github.com/micmonay/keybd_event" 4 | 5 | var ( 6 | names = map[string]keySet{ 7 | "a": keySet{keybd_event.VK_A, false}, 8 | "b": keySet{keybd_event.VK_B, false}, 9 | "c": keySet{keybd_event.VK_C, false}, 10 | "d": keySet{keybd_event.VK_D, false}, 11 | "e": keySet{keybd_event.VK_E, false}, 12 | "f": keySet{keybd_event.VK_F, false}, 13 | "g": keySet{keybd_event.VK_G, false}, 14 | "h": keySet{keybd_event.VK_H, false}, 15 | "i": keySet{keybd_event.VK_I, false}, 16 | "j": keySet{keybd_event.VK_J, false}, 17 | "k": keySet{keybd_event.VK_K, false}, 18 | "l": keySet{keybd_event.VK_L, false}, 19 | "m": keySet{keybd_event.VK_M, false}, 20 | "n": keySet{keybd_event.VK_N, false}, 21 | "o": keySet{keybd_event.VK_O, false}, 22 | "p": keySet{keybd_event.VK_P, false}, 23 | "q": keySet{keybd_event.VK_Q, false}, 24 | "r": keySet{keybd_event.VK_R, false}, 25 | "s": keySet{keybd_event.VK_S, false}, 26 | "t": keySet{keybd_event.VK_T, false}, 27 | "u": keySet{keybd_event.VK_U, false}, 28 | "v": keySet{keybd_event.VK_V, false}, 29 | "w": keySet{keybd_event.VK_W, false}, 30 | "x": keySet{keybd_event.VK_X, false}, 31 | "y": keySet{keybd_event.VK_Y, false}, 32 | "z": keySet{keybd_event.VK_Z, false}, 33 | 34 | "A": keySet{keybd_event.VK_A, true}, 35 | "B": keySet{keybd_event.VK_B, true}, 36 | "C": keySet{keybd_event.VK_C, true}, 37 | "D": keySet{keybd_event.VK_D, true}, 38 | "E": keySet{keybd_event.VK_E, true}, 39 | "F": keySet{keybd_event.VK_F, true}, 40 | "G": keySet{keybd_event.VK_G, true}, 41 | "H": keySet{keybd_event.VK_H, true}, 42 | "I": keySet{keybd_event.VK_I, true}, 43 | "J": keySet{keybd_event.VK_J, true}, 44 | "K": keySet{keybd_event.VK_K, true}, 45 | "L": keySet{keybd_event.VK_L, true}, 46 | "M": keySet{keybd_event.VK_M, true}, 47 | "N": keySet{keybd_event.VK_N, true}, 48 | "O": keySet{keybd_event.VK_O, true}, 49 | "P": keySet{keybd_event.VK_P, true}, 50 | "Q": keySet{keybd_event.VK_Q, true}, 51 | "R": keySet{keybd_event.VK_R, true}, 52 | "S": keySet{keybd_event.VK_S, true}, 53 | "T": keySet{keybd_event.VK_T, true}, 54 | "U": keySet{keybd_event.VK_U, true}, 55 | "V": keySet{keybd_event.VK_V, true}, 56 | "W": keySet{keybd_event.VK_W, true}, 57 | "X": keySet{keybd_event.VK_X, true}, 58 | "Y": keySet{keybd_event.VK_Y, true}, 59 | "Z": keySet{keybd_event.VK_Z, true}, 60 | 61 | "0": keySet{keybd_event.VK_0, false}, 62 | "1": keySet{keybd_event.VK_1, false}, 63 | "2": keySet{keybd_event.VK_2, false}, 64 | "3": keySet{keybd_event.VK_3, false}, 65 | "4": keySet{keybd_event.VK_4, false}, 66 | "5": keySet{keybd_event.VK_5, false}, 67 | "6": keySet{keybd_event.VK_6, false}, 68 | "7": keySet{keybd_event.VK_7, false}, 69 | "8": keySet{keybd_event.VK_8, false}, 70 | "9": keySet{keybd_event.VK_9, false}, 71 | " ": keySet{keybd_event.VK_SPACE, false}, 72 | 73 | ")": keySet{keybd_event.VK_0, true}, 74 | "!": keySet{keybd_event.VK_1, true}, 75 | "@": keySet{keybd_event.VK_2, true}, 76 | "#": keySet{keybd_event.VK_3, true}, 77 | "$": keySet{keybd_event.VK_4, true}, 78 | "%": keySet{keybd_event.VK_5, true}, 79 | "^": keySet{keybd_event.VK_6, true}, 80 | "&": keySet{keybd_event.VK_7, true}, 81 | "*": keySet{keybd_event.VK_8, true}, 82 | "(": keySet{keybd_event.VK_9, true}, 83 | 84 | "-": keySet{keybd_event.VK_MINUS, false}, 85 | "=": keySet{keybd_event.VK_EQUAL, false}, 86 | "[": keySet{keybd_event.VK_LEFTBRACE, false}, 87 | "]": keySet{keybd_event.VK_RIGHTBRACE, false}, 88 | "\\": keySet{keybd_event.VK_BACKSLASH, false}, 89 | ";": keySet{keybd_event.VK_SEMICOLON, false}, 90 | "'": keySet{keybd_event.VK_APOSTROPHE, false}, 91 | ",": keySet{keybd_event.VK_COMMA, false}, 92 | ".": keySet{keybd_event.VK_DOT, false}, 93 | "/": keySet{keybd_event.VK_SLASH, false}, 94 | "`": keySet{keybd_event.VK_GRAVE, false}, 95 | 96 | "_": keySet{keybd_event.VK_MINUS, true}, 97 | "+": keySet{keybd_event.VK_EQUAL, true}, 98 | "{": keySet{keybd_event.VK_LEFTBRACE, true}, 99 | "}": keySet{keybd_event.VK_RIGHTBRACE, true}, 100 | "|": keySet{keybd_event.VK_BACKSLASH, true}, 101 | ":": keySet{keybd_event.VK_SEMICOLON, true}, 102 | "\"": keySet{keybd_event.VK_APOSTROPHE, true}, 103 | "<": keySet{keybd_event.VK_COMMA, true}, 104 | ">": keySet{keybd_event.VK_DOT, true}, 105 | "?": keySet{keybd_event.VK_SLASH, true}, 106 | "~": keySet{keybd_event.VK_GRAVE, true}, 107 | 108 | "ENTER": keySet{keybd_event.VK_ENTER, false}, 109 | "TAB": keySet{keybd_event.VK_TAB, false}, 110 | "BACKSPACE": keySet{keybd_event.VK_BACKSPACE, false}, 111 | } 112 | ) 113 | -------------------------------------------------------------------------------- /keys_windows.go: -------------------------------------------------------------------------------- 1 | package string2keyboard 2 | 3 | import "github.com/micmonay/keybd_event" 4 | 5 | var ( 6 | names = map[string]keySet{ 7 | "a": keySet{keybd_event.VK_A, false}, 8 | "b": keySet{keybd_event.VK_B, false}, 9 | "c": keySet{keybd_event.VK_C, false}, 10 | "d": keySet{keybd_event.VK_D, false}, 11 | "e": keySet{keybd_event.VK_E, false}, 12 | "f": keySet{keybd_event.VK_F, false}, 13 | "g": keySet{keybd_event.VK_G, false}, 14 | "h": keySet{keybd_event.VK_H, false}, 15 | "i": keySet{keybd_event.VK_I, false}, 16 | "j": keySet{keybd_event.VK_J, false}, 17 | "k": keySet{keybd_event.VK_K, false}, 18 | "l": keySet{keybd_event.VK_L, false}, 19 | "m": keySet{keybd_event.VK_M, false}, 20 | "n": keySet{keybd_event.VK_N, false}, 21 | "o": keySet{keybd_event.VK_O, false}, 22 | "p": keySet{keybd_event.VK_P, false}, 23 | "q": keySet{keybd_event.VK_Q, false}, 24 | "r": keySet{keybd_event.VK_R, false}, 25 | "s": keySet{keybd_event.VK_S, false}, 26 | "t": keySet{keybd_event.VK_T, false}, 27 | "u": keySet{keybd_event.VK_U, false}, 28 | "v": keySet{keybd_event.VK_V, false}, 29 | "w": keySet{keybd_event.VK_W, false}, 30 | "x": keySet{keybd_event.VK_X, false}, 31 | "y": keySet{keybd_event.VK_Y, false}, 32 | "z": keySet{keybd_event.VK_Z, false}, 33 | 34 | "A": keySet{keybd_event.VK_A, true}, 35 | "B": keySet{keybd_event.VK_B, true}, 36 | "C": keySet{keybd_event.VK_C, true}, 37 | "D": keySet{keybd_event.VK_D, true}, 38 | "E": keySet{keybd_event.VK_E, true}, 39 | "F": keySet{keybd_event.VK_F, true}, 40 | "G": keySet{keybd_event.VK_G, true}, 41 | "H": keySet{keybd_event.VK_H, true}, 42 | "I": keySet{keybd_event.VK_I, true}, 43 | "J": keySet{keybd_event.VK_J, true}, 44 | "K": keySet{keybd_event.VK_K, true}, 45 | "L": keySet{keybd_event.VK_L, true}, 46 | "M": keySet{keybd_event.VK_M, true}, 47 | "N": keySet{keybd_event.VK_N, true}, 48 | "O": keySet{keybd_event.VK_O, true}, 49 | "P": keySet{keybd_event.VK_P, true}, 50 | "Q": keySet{keybd_event.VK_Q, true}, 51 | "R": keySet{keybd_event.VK_R, true}, 52 | "S": keySet{keybd_event.VK_S, true}, 53 | "T": keySet{keybd_event.VK_T, true}, 54 | "U": keySet{keybd_event.VK_U, true}, 55 | "V": keySet{keybd_event.VK_V, true}, 56 | "W": keySet{keybd_event.VK_W, true}, 57 | "X": keySet{keybd_event.VK_X, true}, 58 | "Y": keySet{keybd_event.VK_Y, true}, 59 | "Z": keySet{keybd_event.VK_Z, true}, 60 | 61 | "0": keySet{keybd_event.VK_0, false}, 62 | "1": keySet{keybd_event.VK_1, false}, 63 | "2": keySet{keybd_event.VK_2, false}, 64 | "3": keySet{keybd_event.VK_3, false}, 65 | "4": keySet{keybd_event.VK_4, false}, 66 | "5": keySet{keybd_event.VK_5, false}, 67 | "6": keySet{keybd_event.VK_6, false}, 68 | "7": keySet{keybd_event.VK_7, false}, 69 | "8": keySet{keybd_event.VK_8, false}, 70 | "9": keySet{keybd_event.VK_9, false}, 71 | " ": keySet{keybd_event.VK_SPACE, false}, 72 | 73 | ")": keySet{keybd_event.VK_0, true}, 74 | "!": keySet{keybd_event.VK_1, true}, 75 | "@": keySet{keybd_event.VK_2, true}, 76 | "#": keySet{keybd_event.VK_3, true}, 77 | "$": keySet{keybd_event.VK_4, true}, 78 | "%": keySet{keybd_event.VK_5, true}, 79 | "^": keySet{keybd_event.VK_6, true}, 80 | "&": keySet{keybd_event.VK_7, true}, 81 | "*": keySet{keybd_event.VK_8, true}, 82 | "(": keySet{keybd_event.VK_9, true}, 83 | 84 | "-": keySet{keybd_event.VK_OEM_MINUS, false}, 85 | "=": keySet{keybd_event.VK_OEM_PLUS, false}, 86 | "[": keySet{keybd_event.VK_OEM_4, false}, 87 | "]": keySet{keybd_event.VK_OEM_6, false}, 88 | "\\": keySet{keybd_event.VK_OEM_5, false}, 89 | ";": keySet{keybd_event.VK_OEM_1, false}, 90 | "'": keySet{keybd_event.VK_OEM_7, false}, 91 | ",": keySet{keybd_event.VK_OEM_COMMA, false}, 92 | ".": keySet{keybd_event.VK_OEM_PERIOD, false}, 93 | "/": keySet{keybd_event.VK_OEM_2, false}, 94 | "`": keySet{keybd_event.VK_OEM_3, false}, 95 | 96 | "_": keySet{keybd_event.VK_OEM_MINUS, true}, 97 | "+": keySet{keybd_event.VK_OEM_PLUS, true}, 98 | "{": keySet{keybd_event.VK_OEM_4, true}, 99 | "}": keySet{keybd_event.VK_OEM_6, true}, 100 | "|": keySet{keybd_event.VK_OEM_5, true}, 101 | ":": keySet{keybd_event.VK_OEM_1, true}, 102 | "\"": keySet{keybd_event.VK_OEM_7, true}, 103 | "<": keySet{keybd_event.VK_OEM_COMMA, true}, 104 | ">": keySet{keybd_event.VK_OEM_PERIOD, true}, 105 | "?": keySet{keybd_event.VK_OEM_2, true}, 106 | "~": keySet{keybd_event.VK_OEM_3, true}, 107 | 108 | "ENTER": keySet{keybd_event.VK_ENTER, false}, 109 | "TAB": keySet{keybd_event.VK_TAB, false}, 110 | "BACKSPACE": keySet{keybd_event.VK_BACK, false}, 111 | } 112 | ) 113 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # string2keyboard 2 | Emulate keyboard input from string 3 | 4 | ## Overview 5 | Package is used to emulate keyboard input. 6 | It is generates keystrokes on the keyboard and sends them to the active text input field. 7 | So cursor should be in some text input field before calling *KeyboardWrite* method. 8 | Escape sequences are available for some special characters ('Tab', 'Enter' etc.) 9 | 10 | ## Install 11 | 12 | ```golang 13 | go get github.com/taglme/string2keyboard 14 | ``` 15 | 16 | ## Import 17 | 18 | ```golang 19 | import ( 20 | 21 | "github.com/taglme/string2keyboard" 22 | 23 | ) 24 | ``` 25 | 26 | ## Usage 27 | 28 | ```golang 29 | message := "Hello world!" 30 | err := string2keyboard.KeyboardWrite(message) 31 | 32 | ``` 33 | ## Special characters 34 | It is possible to pass some special characters using escape sequence. Use backslash character to start escape sequence. 35 | List of available special characters: 36 | 37 | * \n - line feed or newline 38 | * \b - backspace 39 | * \t - horizontal tab 40 | * \\\ - backslash 41 | * \\" - double quote 42 | 43 | 44 | 45 | 46 | ## Basic example 47 | Check usage in example folder. 48 | 49 | ## Special characters example 50 | 51 | ```golang 52 | //Newline example 53 | message := "123\n456" 54 | err := string2keyboard.KeyboardWrite(message) 55 | 56 | //Output 57 | 123 58 | 456 59 | 60 | //Tab example 61 | message := "123\t456" 62 | err := string2keyboard.KeyboardWrite(message) 63 | 64 | //Output 65 | 123 456 66 | 67 | //Backslash example 68 | message := "123\\456" 69 | err := string2keyboard.KeyboardWrite(message) 70 | 71 | //Output 72 | 123\456 73 | 74 | ``` -------------------------------------------------------------------------------- /string2keyboard.go: -------------------------------------------------------------------------------- 1 | package string2keyboard 2 | 3 | import ( 4 | "runtime" 5 | "time" 6 | 7 | "github.com/micmonay/keybd_event" 8 | ) 9 | 10 | type keySet struct { 11 | code int 12 | shift bool 13 | } 14 | 15 | //KeyboardWrite emulate keyboard input from string 16 | func KeyboardWrite(textInput string) error { 17 | kb, err := keybd_event.NewKeyBonding() 18 | if err != nil { 19 | return err 20 | } 21 | // For linux, it is very important wait 2 seconds 22 | if runtime.GOOS == "linux" { 23 | time.Sleep(2 * time.Second) 24 | } 25 | 26 | //Should we skip next character in string 27 | //Used if we found some escape sequence 28 | skip := false 29 | for i, c := range textInput { 30 | if !skip { 31 | if c != '\\' { 32 | kb.SetKeys(names[string(c)].code) 33 | kb.HasSHIFT(names[string(c)].shift) 34 | } else { 35 | //Found backslash escape character 36 | //Check next character 37 | switch textInput[i+1] { 38 | case 'n': 39 | //Found newline character sequence 40 | kb.SetKeys(names["ENTER"].code) 41 | skip = true 42 | case '\\': 43 | //Found backslash character sequence 44 | kb.SetKeys(names["\\"].code) 45 | kb.HasSHIFT(names["\\"].shift) 46 | skip = true 47 | case 'b': 48 | //Found backspace character sequence 49 | kb.SetKeys(names["BACKSPACE"].code) 50 | skip = true 51 | case 't': 52 | //Found tab character sequence 53 | kb.SetKeys(names["TAB"].code) 54 | skip = true 55 | case '"': 56 | //Found double quote character sequence 57 | kb.SetKeys(names["\""].code) 58 | kb.HasSHIFT(names["\""].shift) 59 | skip = true 60 | default: 61 | //Nothing special, jsut backslash output 62 | kb.SetKeys(names["\\"].code) 63 | kb.HasSHIFT(names["\\"].shift) 64 | } 65 | 66 | } 67 | err = kb.Launching() 68 | if err != nil { 69 | return err 70 | } 71 | } else { 72 | skip = false 73 | } 74 | 75 | } 76 | return nil 77 | 78 | } 79 | --------------------------------------------------------------------------------