69 lines
1.3 KiB
Go
69 lines
1.3 KiB
Go
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)
|
|
}
|