func hPackedDIBFromHBITMAP(hBmp win.HBITMAP) (win.HGLOBAL, error) { var dib win.DIBSECTION if win.GetObject(win.HGDIOBJ(hBmp), unsafe.Sizeof(dib), unsafe.Pointer(&dib)) == 0 { return 0, newError("GetObject failed") } bmihSize := uintptr(unsafe.Sizeof(dib.DsBmih)) pixelsSize := uintptr( int32(dib.DsBmih.BiBitCount) * dib.DsBmih.BiWidth * dib.DsBmih.BiHeight) totalSize := bmihSize + pixelsSize hPackedDIB := win.GlobalAlloc(win.GHND, totalSize) dest := win.GlobalLock(hPackedDIB) defer win.GlobalUnlock(hPackedDIB) src := unsafe.Pointer(&dib.DsBmih) win.MoveMemory(dest, src, bmihSize) dest = unsafe.Pointer(uintptr(dest) + bmihSize) src = unsafe.Pointer(uintptr(src) + bmihSize) win.MoveMemory(dest, src, pixelsSize) return hPackedDIB, nil }
func newBitmapFromHBITMAP(hBmp win.HBITMAP) (bmp *Bitmap, err error) { var dib win.DIBSECTION if win.GetObject(win.HGDIOBJ(hBmp), unsafe.Sizeof(dib), unsafe.Pointer(&dib)) == 0 { return nil, newError("GetObject failed") } bmih := &dib.DsBmih bmihSize := uintptr(unsafe.Sizeof(*bmih)) pixelsSize := uintptr(int32(bmih.BiBitCount)*bmih.BiWidth*bmih.BiHeight) / 8 totalSize := uintptr(bmihSize + pixelsSize) hPackedDIB := win.GlobalAlloc(win.GHND, totalSize) dest := win.GlobalLock(hPackedDIB) defer win.GlobalUnlock(hPackedDIB) src := unsafe.Pointer(&dib.DsBmih) win.MoveMemory(dest, src, bmihSize) dest = unsafe.Pointer(uintptr(dest) + bmihSize) src = dib.DsBm.BmBits win.MoveMemory(dest, src, pixelsSize) return &Bitmap{ hBmp: hBmp, hPackedDIB: hPackedDIB, size: Size{ int(bmih.BiWidth), int(bmih.BiHeight), }, }, nil }
// SetText sets the current text data of the clipboard. func (c *ClipboardService) SetText(s string) error { return c.withOpenClipboard(func() error { utf16, err := syscall.UTF16FromString(s) if err != nil { return err } hMem := win.GlobalAlloc(win.GMEM_MOVEABLE, uintptr(len(utf16)*2)) if hMem == 0 { return lastError("GlobalAlloc") } p := win.GlobalLock(hMem) if p == nil { return lastError("GlobalLock()") } win.MoveMemory(p, unsafe.Pointer(&utf16[0]), uintptr(len(utf16)*2)) win.GlobalUnlock(hMem) if 0 == win.SetClipboardData(win.CF_UNICODETEXT, win.HANDLE(hMem)) { // We need to free hMem. defer win.GlobalFree(hMem) return lastError("SetClipboardData") } // The system now owns the memory referred to by hMem. return nil }) }