ホームページ > バックエンド開発 > Golang > Go でクロスプラットフォームのグローバル ホットキーを実装するにはどうすればよいですか?

Go でクロスプラットフォームのグローバル ホットキーを実装するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-08 03:09:02
オリジナル
837 人が閲覧しました

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

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

課題: に応答するクロスプラットフォーム (Mac、Linux、Windows) のグローバル ホットキーの Go での実装操作中のどこでもユーザー入力に対応system.

解決策:

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート