diff --git a/kernel32.go b/kernel32.go index c354388..64a58e0 100644 --- a/kernel32.go +++ b/kernel32.go @@ -342,3 +342,23 @@ func GlobalSize(hMem HGLOBAL) (DWORD, error) { } return DWORD(r), nil } + +func GlobalAlloc(uFlags DWORD, dwBytes uintptr) (HGLOBAL, error) { + kernel32, err := syscall.LoadLibrary("kernel32.dll") + if err != nil { + return 0, err + } + defer syscall.FreeLibrary(kernel32) + ga, err := syscall.GetProcAddress(syscall.Handle(kernel32), "GlobalAlloc") + if err != nil { + return 0, err + } + r, _, errno := syscall.Syscall(ga, 2, uintptr(uFlags), dwBytes, 0) + if r == 0 { + if errno != 0 { + return 0, error(errno) + } + return 0, syscall.EINVAL + } + return HGLOBAL(r), nil +} diff --git a/kernel32typedef.go b/kernel32typedef.go index b4d862b..70965c8 100644 --- a/kernel32typedef.go +++ b/kernel32typedef.go @@ -113,3 +113,19 @@ type FILE_ID_DESCRIPTOR struct { ObjectId DWORDLONG ExtendedFileId DWORDLONG } + +const ( + GMEM_MOVEABLE = 0x0002 + GMEM_ZEROINIT = 0x0040 + GMEM_DDESHARE = 0x2000 + GMEM_SHARE = GMEM_DDESHARE + GMEM_FIXED = 0x0000 + GMEM_DISCARDABLE = 0x0100 + GMEM_NOT_BANKED = 0x1000 + GMEM_NOTIFY = 0x4000 + GMEM_LOWER = GMEM_NOT_BANKED + GMEM_VALID_FLAGS = 0x7F72 + GMEM_INVALID_HANDLE = 0x8000 + GHND = (GMEM_MOVEABLE | GMEM_ZEROINIT) + GPTR = (GMEM_FIXED | GMEM_ZEROINIT) +) diff --git a/user32.go b/user32.go index 20edfae..b3f487a 100644 --- a/user32.go +++ b/user32.go @@ -322,6 +322,23 @@ func SetClipboardViewer(hWndNewViewer HWND) (HWND, error) { return HWND(r), nil } +func GetClipboardSequenceNumber() (DWORD, error) { + user32, err := syscall.LoadLibrary("user32.dll") + if err != nil { + return 0, errors.New("Can't Load User32 API") + } + defer syscall.FreeLibrary(user32) + gcsn, err := syscall.GetProcAddress(syscall.Handle(user32), "GetClipboardSequenceNumber") + if err != nil { + return 0, errors.New("Can't Load GetClipboardSequenceNumber API") + } + r, _, errno := syscall.Syscall(gcsn, 0, 0, 0, 0) + if r == 0 { + return 0, error(errno) + } + return DWORD(r), nil +} + func CreateWindowEx(dwExStyle DWORD, lpClassName, lpWindowName string, dwStyle DWORD, x, y, nWidth, nHeight int, hWndParent HWND, hMenu HMENU, hInstance HINSTANCE, lpParam unsafe.Pointer) (HWND, error) { user32, err := syscall.LoadLibrary("user32.dll") if err != nil {