Maison >développement back-end >Golang >Comment puis-je implémenter des raccourcis clavier globaux dans Go sur plusieurs systèmes d'exploitation, y compris Windows ?

Comment puis-je implémenter des raccourcis clavier globaux dans Go sur plusieurs systèmes d'exploitation, y compris Windows ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-11 13:30:02752parcourir

How can I implement global hotkeys in Go across multiple operating systems, including Windows?

Implémentation des raccourcis clavier globaux dans Go

Bien qu'il existe des options de bibliothèque multiplateforme limitées pour l'implémentation des raccourcis clavier globaux dans Go, il est possible d'utiliser le système appels via le package syscall. Voici comment y parvenir sur plusieurs systèmes d'exploitation, y compris Windows.

Windows

Pour enregistrer les raccourcis clavier sous Windows, nous utilisons la bibliothèque user32.dll et son RegisterHotkey( ) fonction. Voici un exemple complet :

const (
    ModAlt = 1 << iota
    ModCtrl
    ModShift
    ModWin
)

type Hotkey struct {
    Id        int
    Modifiers int
    KeyCode   int
}

func (h *Hotkey) String() string {
    mod := &bytes.Buffer{}
    if h.Modifiers&ModAlt != 0 {
        mod.WriteString("Alt+")
    }
    if h.Modifiers&ModCtrl != 0 {
        mod.WriteString("Ctrl+")
    }
    if h.Modifiers&ModShift != 0 {
        mod.WriteString("Shift+")
    }
    if h.Modifiers&ModWin != 0 {
        mod.WriteString("Win+")
    }
    return fmt.Sprintf("Hotkey[Id: %d, %s%c]", h.Id, mod, h.KeyCode)
}

func main() {
    user32 := syscall.MustLoadDLL("user32")
    reghotkey := user32.MustFindProc("RegisterHotKey")
    defer user32.Release()

    keys := map[int16]*Hotkey{
        1: &Hotkey{1, ModAlt + ModCtrl, 'O'},
        2: &Hotkey{2, ModAlt + ModShift, 'M'},
        3: &Hotkey{3, ModAlt + ModCtrl, 'X'},
    }

    for _, v := range keys {
        r1, _, err := reghotkey.Call(
            0, uintptr(v.Id), uintptr(v.Modifiers), uintptr(v.KeyCode))
        if r1 == 1 {
            fmt.Println("Registered", v)
        } else {
            fmt.Println("Failed to register", v, ", error:", err)
        }
    }

    for {
        var msg = &MSG{}
        peekmsg := user32.MustFindProc("PeekMessageW")
        peekmsg.Call(uintptr(unsafe.Pointer(msg)), 0, 0, 0, 1)

        if id := msg.WPARAM; id != 0 {
            fmt.Println("Hotkey pressed:", keys[id])
            if id == 3 {
                fmt.Println("CTRL+ALT+X pressed, goodbye...")
                return
            }
        }

        time.Sleep(time.Millisecond * 50)
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn