88 lines
1.9 KiB
Go
88 lines
1.9 KiB
Go
//go:build darwin
|
||
// +build darwin
|
||
|
||
package platform
|
||
|
||
/*
|
||
#cgo CFLAGS: -x objective-c
|
||
#cgo LDFLAGS: -framework Cocoa -framework Carbon -framework Vision -framework Foundation
|
||
#include <stdlib.h>
|
||
#include <AppKit/AppKit.h>
|
||
#include "system.h"
|
||
*/
|
||
import "C"
|
||
import (
|
||
"encoding/base64"
|
||
"fmt"
|
||
"sync"
|
||
"unsafe"
|
||
)
|
||
|
||
type HotKeyCallback func()
|
||
|
||
var (
|
||
callbacks = make(map[string]HotKeyCallback)
|
||
mutex sync.RWMutex
|
||
)
|
||
|
||
//export hotKeyCallback
|
||
func hotKeyCallback(keyCode, modifiers C.uint) {
|
||
id := fmt.Sprintf("%d_%d", uint32(keyCode), uint32(modifiers))
|
||
|
||
mutex.RLock()
|
||
cb, exists := callbacks[id]
|
||
mutex.RUnlock()
|
||
|
||
if exists {
|
||
//fmt.Printf("✅ 触发热键: %s\n", id)
|
||
cb()
|
||
} else {
|
||
fmt.Printf("❌ 找不到回调: %s\n", id)
|
||
}
|
||
}
|
||
|
||
// RegisterHotKeyWithCallback 注册热键并绑定 Go 回调
|
||
func RegisterHotKeyWithCallback(keyCode, modifiers uint32, cb HotKeyCallback) {
|
||
id := fmt.Sprintf("%d_%d", keyCode, modifiers)
|
||
|
||
mutex.Lock()
|
||
callbacks[id] = cb
|
||
mutex.Unlock()
|
||
//fmt.Printf("✈️ Registering hotkey: %d %d\n", keyCode, modifiers)
|
||
C.RegisterHotKeyDynamic(C.uint(keyCode), C.uint(modifiers))
|
||
}
|
||
|
||
// 激活当前应用程序
|
||
func ActivateApp() {
|
||
C.NSAppActivateIgnoringOtherApps() // 激活当前应用程序
|
||
}
|
||
|
||
// UnregisterHotKey 注销热键(Go -> C)
|
||
func UnregisterHotKey(keyCode, modifiers uint32) {
|
||
id := fmt.Sprintf("%d_%d", keyCode, modifiers)
|
||
|
||
mutex.Lock()
|
||
delete(callbacks, id)
|
||
mutex.Unlock()
|
||
|
||
//fmt.Printf("🧹 Unregistering hotkey: %d %d\n", keyCode, modifiers)
|
||
C.UnregisterHotKey(C.uint(keyCode), C.uint(modifiers))
|
||
}
|
||
|
||
func HideDock() {
|
||
C.HideDockIcon()
|
||
}
|
||
|
||
// OCR功能
|
||
func RecognizeImageBase64(base64str string) (string, error) {
|
||
data, err := base64.StdEncoding.DecodeString(base64str)
|
||
if err != nil {
|
||
return "", fmt.Errorf("base64 decode failed: %w", err)
|
||
}
|
||
tmp := C.CBytes(data)
|
||
defer C.free(tmp)
|
||
result := C.VisionOCRFromMemory(tmp, C.int(len(data)))
|
||
defer C.free(unsafe.Pointer(result))
|
||
return C.GoString(result), nil
|
||
}
|