add clipboard func
This commit is contained in:
parent
d12184dec6
commit
7a2fe997fb
60
kernel32.go
60
kernel32.go
@ -282,3 +282,63 @@ func DeviceIoControlPtr(hDevice HANDLE, dwIoControlCode DWORD, lpInBuffer uintpt
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
func GlobalLock(hMem HGLOBAL) (unsafe.Pointer, error) {
|
||||
kernel32, err := syscall.LoadLibrary("kernel32.dll")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer syscall.FreeLibrary(kernel32)
|
||||
gl, err := syscall.GetProcAddress(syscall.Handle(kernel32), "GlobalLock")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
r, _, errno := syscall.Syscall(gl, 1, uintptr(hMem), 0, 0)
|
||||
if r == 0 {
|
||||
if errno != 0 {
|
||||
return nil, error(errno)
|
||||
}
|
||||
return nil, syscall.EINVAL
|
||||
}
|
||||
return unsafe.Pointer(r), nil
|
||||
}
|
||||
|
||||
func GlobalUnlock(hMem HGLOBAL) error {
|
||||
kernel32, err := syscall.LoadLibrary("kernel32.dll")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer syscall.FreeLibrary(kernel32)
|
||||
gu, err := syscall.GetProcAddress(syscall.Handle(kernel32), "GlobalUnlock")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
r, _, errno := syscall.Syscall(gu, 1, uintptr(hMem), 0, 0)
|
||||
if r == 0 {
|
||||
if errno != 0 {
|
||||
return error(errno)
|
||||
}
|
||||
return syscall.EINVAL
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GlobalSize(hMem HGLOBAL) (DWORD, error) {
|
||||
kernel32, err := syscall.LoadLibrary("kernel32.dll")
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
defer syscall.FreeLibrary(kernel32)
|
||||
gs, err := syscall.GetProcAddress(syscall.Handle(kernel32), "GlobalSize")
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
r, _, errno := syscall.Syscall(gs, 1, uintptr(hMem), 0, 0)
|
||||
if r == 0 {
|
||||
if errno != 0 {
|
||||
return 0, error(errno)
|
||||
}
|
||||
return 0, syscall.EINVAL
|
||||
}
|
||||
return DWORD(r), nil
|
||||
}
|
||||
|
117
user32.go
117
user32.go
@ -3,6 +3,7 @@ package win32api
|
||||
import (
|
||||
"errors"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
func Keybd_event(keyname string, keydown bool) error {
|
||||
@ -47,3 +48,119 @@ func Keybd_event_origin(key, keyenv, down, extra uintptr) error {
|
||||
syscall.Syscall6(keyevent, 4, key, keyenv, down, extra, 0, 0)
|
||||
return nil
|
||||
}
|
||||
|
||||
func OpenClipboard(hWnd HWND) error {
|
||||
user32, err := syscall.LoadLibrary("user32.dll")
|
||||
if err != nil {
|
||||
return errors.New("Can't Load User32 API")
|
||||
}
|
||||
defer syscall.FreeLibrary(user32)
|
||||
oc, err := syscall.GetProcAddress(syscall.Handle(user32), "OpenClipboard")
|
||||
if err != nil {
|
||||
return errors.New("Can't Load OpenClipboard API")
|
||||
}
|
||||
if hWnd != 0 {
|
||||
if r, _, errno := syscall.Syscall(oc, 1, uintptr(hWnd), 0, 0); r == 0 {
|
||||
return error(errno)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
if r, _, errno := syscall.Syscall(oc, 0, 0, 0, 0); r == 0 {
|
||||
return error(errno)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func CloseClipboard() error {
|
||||
user32, err := syscall.LoadLibrary("user32.dll")
|
||||
if err != nil {
|
||||
return errors.New("Can't Load User32 API")
|
||||
}
|
||||
defer syscall.FreeLibrary(user32)
|
||||
cc, err := syscall.GetProcAddress(syscall.Handle(user32), "CloseClipboard")
|
||||
if err != nil {
|
||||
return errors.New("Can't Load CloseClipboard API")
|
||||
}
|
||||
if r, _, errno := syscall.Syscall(cc, 0, 0, 0, 0); r == 0 {
|
||||
return error(errno)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetClipboardData(uFormat DWORD) (HGLOBAL, error) {
|
||||
user32, err := syscall.LoadLibrary("user32.dll")
|
||||
if err != nil {
|
||||
return 0, errors.New("Can't Load User32 API")
|
||||
}
|
||||
defer syscall.FreeLibrary(user32)
|
||||
gcd, err := syscall.GetProcAddress(syscall.Handle(user32), "GetClipboardData")
|
||||
if err != nil {
|
||||
return 0, errors.New("Can't Load GetClipboardData API")
|
||||
}
|
||||
r, _, errno := syscall.Syscall(gcd, 1, uintptr(uFormat), 0, 0)
|
||||
if r == 0 {
|
||||
return 0, error(errno)
|
||||
}
|
||||
return HGLOBAL(r), nil
|
||||
}
|
||||
|
||||
func EnumClipboardFormats(uFormat DWORD) (DWORD, error) {
|
||||
user32, err := syscall.LoadLibrary("user32.dll")
|
||||
if err != nil {
|
||||
return 0, errors.New("Can't Load User32 API")
|
||||
}
|
||||
defer syscall.FreeLibrary(user32)
|
||||
ecf, err := syscall.GetProcAddress(syscall.Handle(user32), "EnumClipboardFormats")
|
||||
if err != nil {
|
||||
return 0, errors.New("Can't Load EnumClipboardFormats API")
|
||||
}
|
||||
r, _, errno := syscall.Syscall(ecf, 1, uintptr(uFormat), 0, 0)
|
||||
if r == 0 {
|
||||
return 0, error(errno)
|
||||
}
|
||||
return DWORD(r), nil
|
||||
}
|
||||
|
||||
func EnumAllClipboardFormats() ([]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 GetClipboardFormatName(uFormat DWORD) (string, error) {
|
||||
user32, err := syscall.LoadLibrary("user32.dll")
|
||||
if err != nil {
|
||||
return "", errors.New("Can't Load User32 API")
|
||||
}
|
||||
defer syscall.FreeLibrary(user32)
|
||||
gcfn, err := syscall.GetProcAddress(syscall.Handle(user32), "GetClipboardFormatNameW")
|
||||
if err != nil {
|
||||
return "", errors.New("Can't Load GetClipboardFormatName API")
|
||||
}
|
||||
var buffer [256]uint16
|
||||
r, _, errno := syscall.Syscall6(gcfn, 3, uintptr(uFormat), uintptr(unsafe.Pointer(&buffer)), uintptr(len(buffer)), 0, 0, 0)
|
||||
if r == 0 {
|
||||
return "", error(errno)
|
||||
}
|
||||
return syscall.UTF16ToString(buffer[:]), nil
|
||||
}
|
||||
|
||||
func RegisterClipboardFormat(lpszFormat string) DWORD {
|
||||
user32, err := syscall.LoadLibrary("user32.dll")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
defer syscall.FreeLibrary(user32)
|
||||
rcf, err := syscall.GetProcAddress(syscall.Handle(user32), "RegisterClipboardFormatW")
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
r, _, _ := syscall.Syscall(rcf, 1, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpszFormat))), 0, 0)
|
||||
return DWORD(r)
|
||||
}
|
||||
|
65
user32_test.go
Normal file
65
user32_test.go
Normal file
@ -0,0 +1,65 @@
|
||||
package win32api
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"syscall"
|
||||
"testing"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
func TestClipboardReadText(t *testing.T) {
|
||||
if err := OpenClipboard(0); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
formats, err := EnumAllClipboardFormats()
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
tp := CF_UNICODETEXT
|
||||
for _, f := range formats {
|
||||
fmt.Println("Clipboard Format:", f)
|
||||
d, e := GetClipboardFormatName(f)
|
||||
fmt.Println("Clipboard Format Name:", d, e)
|
||||
if d == "HTML Format" {
|
||||
tp = RegisterClipboardFormat("HTML Format")
|
||||
fmt.Println("HTML Format:", tp)
|
||||
}
|
||||
if d == "DataObject" {
|
||||
tp = CF_HDROP
|
||||
fmt.Println("DataObject:", tp)
|
||||
}
|
||||
}
|
||||
|
||||
mem, err := GetClipboardData(tp)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
p, err := GlobalLock(mem)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
defer GlobalUnlock(mem)
|
||||
//n := 0
|
||||
if tp == 13 {
|
||||
var buf []uint16
|
||||
for ptr := unsafe.Pointer(p); *(*uint16)(ptr) != 0; ptr = unsafe.Pointer(uintptr(ptr) + unsafe.Sizeof(*((*uint16)(unsafe.Pointer(p))))) {
|
||||
buf = append(buf, *(*uint16)(ptr))
|
||||
}
|
||||
str := syscall.UTF16ToString(buf)
|
||||
fmt.Println("\n\nClipboard Data:", str)
|
||||
if err := CloseClipboard(); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
return
|
||||
}
|
||||
size, err := GlobalSize(mem)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
var buf []byte
|
||||
for i := 0; i < int(size); i++ {
|
||||
buf = append(buf, *(*byte)(unsafe.Pointer(uintptr(p) + uintptr(i))))
|
||||
}
|
||||
fmt.Println("\n\nClipboard Data:", string(buf))
|
||||
fmt.Println("Clipboard Test Done")
|
||||
}
|
@ -178,3 +178,34 @@ const (
|
||||
VK_PA1 = 0xFD
|
||||
VK_OEM_CLEAR = 0xFE
|
||||
)
|
||||
|
||||
// 剪贴板标准格式
|
||||
const (
|
||||
CF_BITMAP DWORD = 2
|
||||
CF_DIB DWORD = 8
|
||||
CF_DIBV5 DWORD = 17
|
||||
CF_DIF DWORD = 5
|
||||
CF_DSPBITMAP DWORD = 130
|
||||
CF_DSPENHMETAFILE DWORD = 142
|
||||
CF_DSPMETAFILEPICT DWORD = 131
|
||||
CF_DSPTEXT DWORD = 129
|
||||
CF_ENHMETAFILE DWORD = 14
|
||||
CF_GDIOBJFIRST DWORD = 0x0300
|
||||
CF_GDIOBJLAST DWORD = 0x03FF
|
||||
CF_HDROP DWORD = 15
|
||||
CF_LOCALE DWORD = 16
|
||||
CF_METAFILEPICT DWORD = 3
|
||||
CF_OEMTEXT DWORD = 7
|
||||
CF_OWNERDISPLAY DWORD = 0x0080
|
||||
CF_PALETTE DWORD = 9
|
||||
CF_PENDATA DWORD = 10
|
||||
CF_PRIVATEFIRST DWORD = 0x0200
|
||||
CF_PRIVATELAST DWORD = 0x02FF
|
||||
CF_RIFF DWORD = 11
|
||||
CF_SYLK DWORD = 4
|
||||
CF_TEXT DWORD = 1
|
||||
CF_TIFF DWORD = 6
|
||||
CF_UNICODETEXT DWORD = 13
|
||||
CF_WAVE DWORD = 12
|
||||
CF_HENHMETAFILE DWORD = 14
|
||||
)
|
||||
|
Loading…
x
Reference in New Issue
Block a user