package input import ( "runtime" "strings" ) func PressKey(key, action string, modifiers []string) error { vk, ok := vkCode(key) if !ok { return ErrBadKey } runtime.LockOSThread() defer runtime.UnlockOSThread() if err := attachInputDesktop(); err != nil { return err } modVKs := make([]uint16, 0, len(modifiers)) for _, mod := range modifiers { modVK, ok := vkCode(mod) if !ok { return ErrBadKey } modVKs = append(modVKs, modVK) } for _, modVK := range modVKs { if err := sendKeyEvent(modVK, false); err != nil { return err } } switch strings.ToLower(strings.TrimSpace(action)) { case "down": if err := sendKeyEvent(vk, false); err != nil { return err } case "up": if err := sendKeyEvent(vk, true); err != nil { return err } default: if err := sendKeyEvent(vk, false); err != nil { return err } if err := sendKeyEvent(vk, true); err != nil { return err } for i := len(modVKs) - 1; i >= 0; i-- { if err := sendKeyEvent(modVKs[i], true); err != nil { return err } } return nil } return nil } func sendKeyEvent(vk uint16, keyUp bool) error { flags := uint32(0) if keyUp { flags = keyeventfKeyup } inputs := []keybdInput{{Type: inputKeyboard, Vk: vk, Flags: flags}} return sendKeys(inputs) }