micmonay / keybd_event

For simulate key press in Linux, Windows and Mac in golang
MIT License
376 stars 56 forks source link
cgevent event golang key keybd-event keyboard linux macos simulate simulation uinput windows

keybd_event

go.dev reference

This library simulates the key press on a keyboard. It runs on Linux, Windows and Mac.

Important :

Example :

package main

import (
    "runtime"
    "time"
    "github.com/micmonay/keybd_event"
)

func main() {
    kb, err := keybd_event.NewKeyBonding()
    if err != nil {
        panic(err)
    }

    // For linux, it is very important to wait 2 seconds
    if runtime.GOOS == "linux" {
        time.Sleep(2 * time.Second)
    }

    // Select keys to be pressed
    kb.SetKeys(keybd_event.VK_A, keybd_event.VK_B) 

    // Set shift to be pressed
    kb.HasSHIFT(true) 

    // Press the selected keys
    err = kb.Launching() 
    if err != nil {
        panic(err)
    }

    // Or you can use Press and Release
    kb.Press()
    time.Sleep(10 * time.Millisecond)
    kb.Release()

    // Here, the program will generate "ABAB" as if they were pressed on the keyboard.
}

For easy access to all the keys on the virtual keyboard, I have added more special keycodes constants VK_SP*.

Below is an illustration showing the "VK_" symbols for each key on the keyboard: keyboard.png

Linux

On Linux this library uses uinput, which on the major distributions requires root permissions.

The easy solution is executing through root user (by using sudo). A worse way is by changing the executable's permissions by using chmod.

Secure Linux Example

sudo groupadd uinput
sudo usermod -a -G uinput my_username
sudo udevadm control --reload-rules
echo "SUBSYSTEM==\"misc\", KERNEL==\"uinput\", GROUP=\"uinput\", MODE=\"0660\"" | sudo tee /etc/udev/rules.d/uinput.rules
echo uinput | sudo tee /etc/modules-load.d/uinput.conf

Another subtlety on Linux: it is important after creating the keybd_event to wait 2 seconds before running first keyboard actions.

Darwin (MacOS)

This library depends on Apple's frameworks, and I did not find a solution to cross-compile from another OS to MacOS.