Files
go-worm/lib/input/key.go
T

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)
}