Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Melaksanakan Kekunci Panas Global Merentas Platform dalam Go?

Bagaimana untuk Melaksanakan Kekunci Panas Global Merentas Platform dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-11-08 03:09:02845semak imbas

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

Melaksanakan Kekunci Panas Global dalam Go

Cabaran: Melaksanakan kekunci panas global merentas platform (Mac, Linux, Windows) dalam Go yang bertindak balas kepada input pengguna di mana-mana dalam sistem pengendalian.

Penyelesaian:

Menggunakan pakej syscall, seseorang boleh mengakses fungsi sistem pengendalian asli untuk mendaftar dan mendengar hotkey global.

Untuk Windows khususnya:

  1. Muat User32 DLL: Muatkan perpustakaan user32.dll, yang mengandungi fungsi yang diperlukan untuk pengurusan hotkey.
  2. Daftar Kekunci Panas: Gunakan fungsi RegisterHotKey untuk mendaftarkan kekunci pintas dengan kombinasi kekunci tertentu.
  3. Kendalikan Peristiwa Utama: Gunakan fungsi PeekMessage untuk menyemak dan membalas acara mesej secara berterusan . Apabila kekunci pintas ditekan, ID berdaftarnya disimpan dalam medan WPARAM, membenarkan aplikasi mengenal pasti kekunci pintas yang ditekan.

Contoh Aplikasi:

A aplikasi Go mudah yang menunjukkan pendaftaran dan pengendalian hotkey pada 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)
    }
}

Contoh ini menyediakan pelaksanaan lengkap pendaftaran dan pengendalian hotkey pada Windows, yang boleh disesuaikan untuk sistem pengendalian lain menggunakan prinsip yang sama.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Kekunci Panas Global Merentas Platform dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn