Maison  >  Article  >  développement back-end  >  Comment implémenter un raccourci clavier global multiplateforme dans Go ?

Comment implémenter un raccourci clavier global multiplateforme dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-08 03:09:02781parcourir

How to Implement a Cross-Platform Global Hotkey in Go?

Implémentation d'un raccourci clavier global dans Go

Défi : Implémentation d'un raccourci clavier global multiplateforme (Mac, Linux, Windows) dans Go qui répond à la saisie de l'utilisateur n'importe où dans le système d'exploitation.

Solution :

En utilisant le package syscall, on peut accéder aux fonctions natives du système d'exploitation pour s'inscrire et écouter les raccourcis clavier globaux.

Pour Windows spécifiquement :

  1. Charger la DLL User32 : Chargez la bibliothèque user32.dll, qui contient les fonctions nécessaires à la gestion des raccourcis clavier.
  2. Enregistrer les raccourcis clavier : Utilisez la fonction RegisterHotKey pour enregistrer des raccourcis clavier avec des combinaisons de touches spécifiques.
  3. Gérer les événements clés : Utilisez la fonction PeekMessage pour rechercher et répondre en permanence aux événements de message. . Lorsqu'une touche de raccourci est enfoncée, son identifiant enregistré est stocké dans le champ WPARAM, permettant à l'application d'identifier la touche de raccourci enfoncée.

Exemple d'application :

A Application Go simple qui démontre l'enregistrement et la gestion des raccourcis clavier sous Windows :

package main

import (
    "fmt"
    "os"
    "time"

    "github.com/gonuts/syscall/՚user32"
)

type Hotkey struct {
    Id        int // Unique id
    Modifiers int // Mask of modifiers
    KeyCode   int // Key code, e.g. 'A'
}

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

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

func main() {
    user32 := syscall.MustLoadDll("user32")
    defer user32.Release()

    reghotkey := user32.MustFindProc("RegisterHotKey")
    peekmsg := user32.MustFindProc("PeekMessageW")

    keys := map[int16]*Hotkey{
        1: &Hotkey{1, ModAlt + ModCtrl, 'O'},  // ALT+CTRL+O
        2: &Hotkey{2, ModAlt + ModShift, 'M'}, // ALT+SHIFT+M
        3: &Hotkey{3, ModAlt + ModCtrl, 'X'},  // ALT+CTRL+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.Call(uintptr(unsafe.Pointer(msg)), 0, 0, 0, 1)

        // Registered id is in the WPARAM field:
        if id := msg.WPARAM; id != 0 {
            fmt.Println("Hotkey pressed:", keys[id])
            if id == 3 { // CTRL+ALT+X = Exit
                fmt.Println("CTRL+ALT+X pressed, goodbye...")
                os.Exit(0)
            }
        }

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

Cet exemple fournit une implémentation complète de l'enregistrement et de la gestion des raccourcis clavier sous Windows, qui peut être adaptée pour d'autres systèmes d'exploitation utilisant des principes similaires.

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