ホームページ  >  記事  >  バックエンド開発  >  Windows を含む複数のオペレーティング システムにわたって Go にグローバル ホットキーを実装するにはどうすればよいですか?

Windows を含む複数のオペレーティング システムにわたって Go にグローバル ホットキーを実装するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-11 13:30:02708ブラウズ

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

Go でのグローバル ホットキーの実装

Go でグローバル ホットキーを実装するためのクロスプラットフォーム ライブラリ オプションは限られていますが、システムを使用して実行できます。 syscall パッケージを介した呼び出し。 Windows を含む複数のオペレーティング システムでこれを実現する方法を次に示します。

Windows

Windows でホットキーを登録するには、user32.dll ライブラリとその RegisterHotkey( ) 関数。完全な例を次に示します:

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

以上がWindows を含む複数のオペレーティング システムにわたって Go にグローバル ホットキーを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。