2026-08-28 13:11:56 +03:00
|
|
|
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)
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-28 13:20:04 +03:00
|
|
|
var inputs []winInput
|
2026-08-28 13:11:56 +03:00
|
|
|
for _, modVK := range modVKs {
|
2026-08-28 13:20:04 +03:00
|
|
|
inputs = append(inputs, keyInput(modVK, false))
|
2026-08-28 13:11:56 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch strings.ToLower(strings.TrimSpace(action)) {
|
|
|
|
|
case "down":
|
2026-08-28 13:20:04 +03:00
|
|
|
inputs = append(inputs, keyInput(vk, false))
|
2026-08-28 13:11:56 +03:00
|
|
|
case "up":
|
2026-08-28 13:20:04 +03:00
|
|
|
inputs = append(inputs, keyInput(vk, true))
|
2026-08-28 13:11:56 +03:00
|
|
|
default:
|
2026-08-28 13:20:04 +03:00
|
|
|
inputs = append(inputs, keyInput(vk, false), keyInput(vk, true))
|
2026-08-28 13:11:56 +03:00
|
|
|
for i := len(modVKs) - 1; i >= 0; i-- {
|
2026-08-28 13:20:04 +03:00
|
|
|
inputs = append(inputs, keyInput(modVKs[i], true))
|
2026-08-28 13:11:56 +03:00
|
|
|
}
|
|
|
|
|
}
|
2026-08-28 13:20:04 +03:00
|
|
|
|
|
|
|
|
return sendKeyboardInputs(inputs)
|
2026-08-28 13:11:56 +03:00
|
|
|
}
|
|
|
|
|
|
2026-08-28 13:20:04 +03:00
|
|
|
func keyInput(vk uint16, keyUp bool) winInput {
|
2026-08-28 13:11:56 +03:00
|
|
|
flags := uint32(0)
|
|
|
|
|
if keyUp {
|
2026-08-28 13:20:04 +03:00
|
|
|
flags |= keyeventfKeyup
|
|
|
|
|
}
|
|
|
|
|
if isExtendedVK(vk) {
|
|
|
|
|
flags |= keyeventfExtended
|
|
|
|
|
}
|
|
|
|
|
return winInput{
|
|
|
|
|
Type: inputKeyboard,
|
|
|
|
|
Ki: keyboardData{
|
|
|
|
|
Vk: vk,
|
|
|
|
|
Flags: flags,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func isExtendedVK(vk uint16) bool {
|
|
|
|
|
switch vk {
|
|
|
|
|
case 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x2D, 0x2E, 0x5B, 0x5C, 0x5D:
|
|
|
|
|
return true
|
|
|
|
|
default:
|
|
|
|
|
return false
|
2026-08-28 13:11:56 +03:00
|
|
|
}
|
|
|
|
|
}
|