63 lines
1.2 KiB
Go
63 lines
1.2 KiB
Go
//go:build windows
|
|
|
|
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"syscall"
|
|
"unsafe"
|
|
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
const (
|
|
mbIconError = 0x10
|
|
mbIconInformation = 0x40
|
|
)
|
|
|
|
var (
|
|
user32 = syscall.NewLazyDLL("user32.dll")
|
|
procMessageBoxW = user32.NewProc("MessageBoxW")
|
|
callMessageBoxW = func(hwnd, text, caption, flags uintptr) (uintptr, error) {
|
|
ret, _, err := procMessageBoxW.Call(hwnd, text, caption, flags)
|
|
return ret, err
|
|
}
|
|
)
|
|
|
|
func showError(title, message string) {
|
|
if err := messageBox(title, message, mbIconError); err != nil {
|
|
if zapLogger != nil {
|
|
zapLogger.Warn("显示错误对话框失败", zap.Error(err))
|
|
}
|
|
}
|
|
}
|
|
|
|
func messageBox(title, message string, flags uint) error {
|
|
titlePtr, err := syscall.UTF16PtrFromString(title)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
messagePtr, err := syscall.UTF16PtrFromString(message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
ret, callErr := callMessageBoxW(
|
|
0,
|
|
uintptr(unsafe.Pointer(messagePtr)),
|
|
uintptr(unsafe.Pointer(titlePtr)),
|
|
uintptr(flags),
|
|
)
|
|
if ret != 0 {
|
|
return nil
|
|
}
|
|
|
|
if callErr != nil && !errors.Is(callErr, syscall.Errno(0)) {
|
|
return callErr
|
|
}
|
|
|
|
return fmt.Errorf("MessageBoxW 调用失败")
|
|
}
|