Heim >Backend-Entwicklung >Golang >Wie implementiert man einen plattformübergreifenden globalen Hotkey in Go?

Wie implementiert man einen plattformübergreifenden globalen Hotkey in Go?

Barbara Streisand
Barbara StreisandOriginal
2024-11-08 03:09:02840Durchsuche

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

Implementieren eines globalen Hotkeys in Go

Herausforderung:Implementieren eines plattformübergreifenden (Mac, Linux, Windows) globalen Hotkeys in Go, der reagiert auf Benutzereingaben an beliebiger Stelle im Betrieb System.

Lösung:

Mit dem Syscall-Paket kann man auf native Betriebssystemfunktionen zugreifen, um sich zu registrieren und auf globale Hotkeys zu warten.

Für Windows Insbesondere:

  1. User32 DLL laden:Laden Sie die user32.dll-Bibliothek, die die notwendigen Funktionen für die Hotkey-Verwaltung enthält.
  2. Hotkeys registrieren: Verwenden Sie die RegisterHotKey-Funktion, um Hotkeys mit bestimmten Tastenkombinationen zu registrieren.
  3. Behandeln Sie wichtige Ereignisse: Nutzen Sie die PeekMessage-Funktion, um kontinuierlich nach Nachrichtenereignissen zu suchen und darauf zu reagieren. Wenn ein Hotkey gedrückt wird, wird seine registrierte ID im WPARAM-Feld gespeichert, sodass die Anwendung den gedrückten Hotkey identifizieren kann.

Beispielanwendung:

A einfache Go-Anwendung, die die Registrierung und Handhabung von Hotkeys unter Windows demonstriert:

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

Dieses Beispiel bietet eine vollständige Implementierung der Registrierung und Handhabung von Hotkeys unter Windows. die nach ähnlichen Prinzipien für andere Betriebssysteme angepasst werden können.

Das obige ist der detaillierte Inhalt vonWie implementiert man einen plattformübergreifenden globalen Hotkey in Go?. 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