>백엔드 개발 >Golang >Go에서 크로스 플랫폼 글로벌 단축키를 구현하는 방법은 무엇입니까?

Go에서 크로스 플랫폼 글로벌 단축키를 구현하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-08 03:09:02840검색

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

Go에서 전역 단축키 구현

과제: Go에서 응답하는 크로스 플랫폼(Mac, Linux, Windows) 전역 단축키 구현

해결책:

syscall 패키지를 활용하면 기본 운영 체제 기능에 액세스하여 전역 단축키를 등록하고 수신할 수 있습니다.

Windows의 경우:

  1. User32 DLL 로드: 단축키 관리에 필요한 기능이 포함된 user32.dll 라이브러리를 로드합니다.
  2. 단축키 등록: 특정 키 조합으로 단축키를 등록하려면 RegisterHotKey 기능을 사용하세요.
  3. 키 이벤트 처리: 메시지 이벤트를 지속적으로 확인하고 응답하려면 PeekMessage 기능을 사용하세요. . 단축키를 누르면 등록된 ID가 WPARAM 필드에 저장되어 애플리케이션이 누른 단축키를 식별할 수 있습니다.

예제 애플리케이션:

A Windows에서 단축키 등록 및 처리를 보여주는 간단한 Go 애플리케이션:

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

이 예는 유사한 원칙을 사용하여 다른 운영 체제에 적용할 수 있는 Windows에서의 단축키 등록 및 처리의 완전한 구현을 제공합니다.

위 내용은 Go에서 크로스 플랫폼 글로벌 단축키를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.