60 lines
1.1 KiB
Go
60 lines
1.1 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
var (
|
|
modkernel32 = syscall.NewLazyDLL("kernel32.dll")
|
|
procCreateMutex = modkernel32.NewProc("CreateMutexW")
|
|
procCloseHandle = modkernel32.NewProc("CloseHandle")
|
|
user32 = syscall.NewLazyDLL("user32.dll")
|
|
procMessageBox = user32.NewProc("MessageBoxW")
|
|
)
|
|
|
|
const MB_OK = 0x00000000
|
|
|
|
const MB_ICONWARNING = 0x00000030
|
|
|
|
func MessageBox(title, msg string) {
|
|
procMessageBox.Call(
|
|
0,
|
|
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(msg))),
|
|
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(title))),
|
|
MB_OK|MB_ICONWARNING,
|
|
)
|
|
}
|
|
|
|
var ErrAlreadyExists = fmt.Errorf("程序已在运行")
|
|
|
|
func createMutex(name string) (uintptr, error) {
|
|
n, _ := syscall.UTF16PtrFromString(name)
|
|
|
|
r, _, err := procCreateMutex.Call(
|
|
0,
|
|
0,
|
|
uintptr(unsafe.Pointer(n)),
|
|
)
|
|
|
|
if r == 0 {
|
|
return 0, err
|
|
}
|
|
|
|
if errno, ok := err.(syscall.Errno); ok && errno == 183 { // ERROR_ALREADY_EXISTS
|
|
return 0, ErrAlreadyExists
|
|
}
|
|
|
|
return r, nil
|
|
}
|
|
|
|
func lock() {
|
|
mutex, err := createMutex("back_cover_mutex")
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
defer procCloseHandle.Call(mutex)
|
|
}
|