Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich globale Hotkeys in Go auf mehreren Betriebssystemen, einschließlich Windows, implementieren?

Wie kann ich globale Hotkeys in Go auf mehreren Betriebssystemen, einschließlich Windows, implementieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-11 13:30:02707Durchsuche

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

Globale Hotkeys in Go implementieren

Während es begrenzte plattformübergreifende Bibliotheksoptionen für die Implementierung globaler Hotkeys in Go gibt, ist dies mit dem System möglich Aufrufe über das Syscall-Paket. So können Sie dies auf mehreren Betriebssystemen, einschließlich Windows, erreichen.

Windows

Um Hotkeys in Windows zu registrieren, verwenden wir die Bibliothek user32.dll und ihren RegisterHotkey( ) Funktion. Hier ist ein vollständiges Beispiel:

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

Das obige ist der detaillierte Inhalt vonWie kann ich globale Hotkeys in Go auf mehreren Betriebssystemen, einschließlich Windows, implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn