158 lines
3.7 KiB
Go
158 lines
3.7 KiB
Go
//go:build windows
|
|
|
|
package w32
|
|
|
|
import (
|
|
"syscall"
|
|
"unicode/utf16"
|
|
"unsafe"
|
|
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
var (
|
|
ole32 = windows.NewLazySystemDLL("ole32")
|
|
Ole32OleInitialize = ole32.NewProc("OleInitialize")
|
|
|
|
kernel32 = windows.NewLazySystemDLL("kernel32")
|
|
Kernel32GetCurrentThreadID = kernel32.NewProc("GetCurrentThreadId")
|
|
|
|
shlwapi = windows.NewLazySystemDLL("shlwapi")
|
|
shlwapiSHCreateMemStream = shlwapi.NewProc("SHCreateMemStream")
|
|
|
|
user32 = windows.NewLazySystemDLL("user32")
|
|
User32LoadImageW = user32.NewProc("LoadImageW")
|
|
User32GetSystemMetrics = user32.NewProc("GetSystemMetrics")
|
|
User32RegisterClassExW = user32.NewProc("RegisterClassExW")
|
|
User32CreateWindowExW = user32.NewProc("CreateWindowExW")
|
|
User32DestroyWindow = user32.NewProc("DestroyWindow")
|
|
User32ShowWindow = user32.NewProc("ShowWindow")
|
|
User32UpdateWindow = user32.NewProc("UpdateWindow")
|
|
User32SetFocus = user32.NewProc("SetFocus")
|
|
User32GetMessageW = user32.NewProc("GetMessageW")
|
|
User32TranslateMessage = user32.NewProc("TranslateMessage")
|
|
User32DispatchMessageW = user32.NewProc("DispatchMessageW")
|
|
User32DefWindowProcW = user32.NewProc("DefWindowProcW")
|
|
User32GetClientRect = user32.NewProc("GetClientRect")
|
|
User32PostQuitMessage = user32.NewProc("PostQuitMessage")
|
|
User32SetWindowTextW = user32.NewProc("SetWindowTextW")
|
|
User32PostThreadMessageW = user32.NewProc("PostThreadMessageW")
|
|
User32GetWindowLongPtrW = user32.NewProc("GetWindowLongPtrW")
|
|
User32SetWindowLongPtrW = user32.NewProc("SetWindowLongPtrW")
|
|
User32AdjustWindowRect = user32.NewProc("AdjustWindowRect")
|
|
User32SetWindowPos = user32.NewProc("SetWindowPos")
|
|
)
|
|
|
|
const (
|
|
SystemMetricsCxIcon = 11
|
|
SystemMetricsCyIcon = 12
|
|
)
|
|
|
|
const (
|
|
SWShow = 5
|
|
)
|
|
|
|
const (
|
|
SWPNoZOrder = 0x0004
|
|
SWPNoActivate = 0x0010
|
|
SWPNoMove = 0x0002
|
|
SWPFrameChanged = 0x0020
|
|
)
|
|
|
|
const (
|
|
WMDestroy = 0x0002
|
|
WMMove = 0x0003
|
|
WMSize = 0x0005
|
|
WMClose = 0x0010
|
|
WMQuit = 0x0012
|
|
WMGetMinMaxInfo = 0x0024
|
|
WMNCLButtonDown = 0x00A1
|
|
WMMoving = 0x0216
|
|
WMApp = 0x8000
|
|
)
|
|
|
|
const (
|
|
GWLStyle = -16
|
|
)
|
|
|
|
const (
|
|
WSOverlapped = 0x00000000
|
|
WSMaximizeBox = 0x00020000
|
|
WSThickFrame = 0x00040000
|
|
WSCaption = 0x00C00000
|
|
WSSysMenu = 0x00080000
|
|
WSMinimizeBox = 0x00020000
|
|
WSOverlappedWindow = (WSOverlapped | WSCaption | WSSysMenu | WSThickFrame | WSMinimizeBox | WSMaximizeBox)
|
|
)
|
|
|
|
type WndClassExW struct {
|
|
CbSize uint32
|
|
Style uint32
|
|
LpfnWndProc uintptr
|
|
CnClsExtra int32
|
|
CbWndExtra int32
|
|
HInstance windows.Handle
|
|
HIcon windows.Handle
|
|
HCursor windows.Handle
|
|
HbrBackground windows.Handle
|
|
LpszMenuName *uint16
|
|
LpszClassName *uint16
|
|
HIconSm windows.Handle
|
|
}
|
|
|
|
type Rect struct {
|
|
Left int32
|
|
Top int32
|
|
Right int32
|
|
Bottom int32
|
|
}
|
|
|
|
type MinMaxInfo struct {
|
|
PtReserved Point
|
|
PtMaxSize Point
|
|
PtMaxPosition Point
|
|
PtMinTrackSize Point
|
|
PtMaxTrackSize Point
|
|
}
|
|
|
|
type Point struct {
|
|
X, Y int32
|
|
}
|
|
|
|
type Msg struct {
|
|
Hwnd syscall.Handle
|
|
Message uint32
|
|
WParam uintptr
|
|
LParam uintptr
|
|
Time uint32
|
|
Pt Point
|
|
LPrivate uint32
|
|
}
|
|
|
|
func Utf16PtrToString(p *uint16) string {
|
|
if p == nil {
|
|
return ""
|
|
}
|
|
// Find NUL terminator.
|
|
end := unsafe.Pointer(p)
|
|
n := 0
|
|
for *(*uint16)(end) != 0 {
|
|
end = unsafe.Pointer(uintptr(end) + unsafe.Sizeof(*p))
|
|
n++
|
|
}
|
|
s := (*[(1 << 30) - 1]uint16)(unsafe.Pointer(p))[:n:n]
|
|
return string(utf16.Decode(s))
|
|
}
|
|
|
|
func SHCreateMemStream(data []byte) (uintptr, error) {
|
|
ret, _, err := shlwapiSHCreateMemStream.Call(
|
|
uintptr(unsafe.Pointer(&data[0])),
|
|
uintptr(len(data)),
|
|
)
|
|
if ret == 0 {
|
|
return 0, err
|
|
}
|
|
|
|
return ret, nil
|
|
}
|