From e56f9d7cc909643acf25c0ac56ec429583bbb33e Mon Sep 17 00:00:00 2001 From: Starainrt Date: Tue, 26 Mar 2024 13:49:52 +0800 Subject: [PATCH] update clipboard func --- user32.go | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) diff --git a/user32.go b/user32.go index d7fef9a..262133f 100644 --- a/user32.go +++ b/user32.go @@ -164,3 +164,141 @@ func RegisterClipboardFormat(lpszFormat string) DWORD { r, _, _ := syscall.Syscall(rcf, 1, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpszFormat))), 0, 0) return DWORD(r) } + +func EmptyClipboard() error { + user32, err := syscall.LoadLibrary("user32.dll") + if err != nil { + return errors.New("Can't Load User32 API") + } + defer syscall.FreeLibrary(user32) + ec, err := syscall.GetProcAddress(syscall.Handle(user32), "EmptyClipboard") + if err != nil { + return errors.New("Can't Load EmptyClipboard API") + } + if r, _, errno := syscall.Syscall(ec, 0, 0, 0, 0); r == 0 { + return error(errno) + } + return nil +} + +func CountClipboardFormats() (int, error) { + user32, err := syscall.LoadLibrary("user32.dll") + if err != nil { + return 0, errors.New("Can't Load User32 API") + } + defer syscall.FreeLibrary(user32) + ccf, err := syscall.GetProcAddress(syscall.Handle(user32), "CountClipboardFormats") + if err != nil { + return 0, errors.New("Can't Load CountClipboardFormats API") + } + r, _, errno := syscall.Syscall(ccf, 0, 0, 0, 0) + if r == 0 { + return 0, error(errno) + } + return int(r), nil +} + +func GetClipboardOwner() (HWND, error) { + user32, err := syscall.LoadLibrary("user32.dll") + if err != nil { + return 0, errors.New("Can't Load User32 API") + } + defer syscall.FreeLibrary(user32) + gco, err := syscall.GetProcAddress(syscall.Handle(user32), "GetClipboardOwner") + if err != nil { + return 0, errors.New("Can't Load GetClipboardOwner API") + } + r, _, errno := syscall.Syscall(gco, 0, 0, 0, 0) + if r == 0 { + return 0, error(errno) + } + return HWND(r), nil +} + +func GetUpdatedClipboardFormats() ([]DWORD, error) { + var formats []DWORD + for i := 0; ; i++ { + format, err := EnumClipboardFormats(DWORD(i)) + if err != nil { + break + } + formats = append(formats, format) + } + return formats, nil +} + +func IsClipboardFormatAvailable(uFormat DWORD) (bool, error) { + user32, err := syscall.LoadLibrary("user32.dll") + if err != nil { + return false, err + } + defer syscall.FreeLibrary(user32) + icfa, err := syscall.GetProcAddress(syscall.Handle(user32), "IsClipboardFormatAvailable") + if err != nil { + return false, err + } + r, _, _ := syscall.Syscall(icfa, 1, uintptr(uFormat), 0, 0) + return r != 0, nil +} + +func AddClipboardFormatListener(hWnd HWND) (bool, error) { + user32, err := syscall.LoadLibrary("user32.dll") + if err != nil { + return false, err + } + defer syscall.FreeLibrary(user32) + acfl, err := syscall.GetProcAddress(syscall.Handle(user32), "AddClipboardFormatListener") + if err != nil { + return false, err + } + r, _, _ := syscall.Syscall(acfl, 1, uintptr(hWnd), 0, 0) + return r != 0, nil +} + +func RemoveClipboardFormatListener(hWnd HWND) (bool, error) { + user32, err := syscall.LoadLibrary("user32.dll") + if err != nil { + return false, err + } + defer syscall.FreeLibrary(user32) + rcfl, err := syscall.GetProcAddress(syscall.Handle(user32), "RemoveClipboardFormatListener") + if err != nil { + return false, err + } + r, _, _ := syscall.Syscall(rcfl, 1, uintptr(hWnd), 0, 0) + return r != 0, nil +} + +func SetClipboardData(uFormat DWORD, hMem HGLOBAL) (HGLOBAL, error) { + user32, err := syscall.LoadLibrary("user32.dll") + if err != nil { + return 0, errors.New("Can't Load User32 API") + } + defer syscall.FreeLibrary(user32) + scd, err := syscall.GetProcAddress(syscall.Handle(user32), "SetClipboardData") + if err != nil { + return 0, errors.New("Can't Load SetClipboardData API") + } + r, _, errno := syscall.Syscall(scd, 2, uintptr(uFormat), uintptr(hMem), 0) + if r == 0 { + return 0, error(errno) + } + return HGLOBAL(r), nil +} + +func SetClipboardViewer(hWndNewViewer HWND) (HWND, error) { + user32, err := syscall.LoadLibrary("user32.dll") + if err != nil { + return 0, errors.New("Can't Load User32 API") + } + defer syscall.FreeLibrary(user32) + scv, err := syscall.GetProcAddress(syscall.Handle(user32), "SetClipboardViewer") + if err != nil { + return 0, errors.New("Can't Load SetClipboardViewer API") + } + r, _, errno := syscall.Syscall(scv, 1, uintptr(hWndNewViewer), 0, 0) + if r == 0 { + return 0, error(errno) + } + return HWND(r), nil +}