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
Freigeben: 2024-11-08 03:09:02
Original
799 Leute haben es durchsucht

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)
    }
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage