257 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2010-2012 The W32 Authors. All rights reserved.
 | 
						|
// Use of this source code is governed by a BSD-style
 | 
						|
// license that can be found in the LICENSE file.
 | 
						|
 | 
						|
// +build windows
 | 
						|
 | 
						|
package w32
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"syscall"
 | 
						|
	"unsafe"
 | 
						|
)
 | 
						|
 | 
						|
// DEFINED IN THE DWM API BUT NOT IMPLEMENTED BY MS:
 | 
						|
// DwmAttachMilContent
 | 
						|
// DwmDetachMilContent
 | 
						|
// DwmEnableComposition
 | 
						|
// DwmGetGraphicsStreamClient
 | 
						|
// DwmGetGraphicsStreamTransformHint
 | 
						|
 | 
						|
var (
 | 
						|
	moddwmapi = syscall.NewLazyDLL("dwmapi.dll")
 | 
						|
 | 
						|
	procDwmDefWindowProc                 = moddwmapi.NewProc("DwmDefWindowProc")
 | 
						|
	procDwmEnableBlurBehindWindow        = moddwmapi.NewProc("DwmEnableBlurBehindWindow")
 | 
						|
	procDwmEnableMMCSS                   = moddwmapi.NewProc("DwmEnableMMCSS")
 | 
						|
	procDwmExtendFrameIntoClientArea     = moddwmapi.NewProc("DwmExtendFrameIntoClientArea")
 | 
						|
	procDwmFlush                         = moddwmapi.NewProc("DwmFlush")
 | 
						|
	procDwmGetColorizationColor          = moddwmapi.NewProc("DwmGetColorizationColor")
 | 
						|
	procDwmGetCompositionTimingInfo      = moddwmapi.NewProc("DwmGetCompositionTimingInfo")
 | 
						|
	procDwmGetTransportAttributes        = moddwmapi.NewProc("DwmGetTransportAttributes")
 | 
						|
	procDwmGetWindowAttribute            = moddwmapi.NewProc("DwmGetWindowAttribute")
 | 
						|
	procDwmInvalidateIconicBitmaps       = moddwmapi.NewProc("DwmInvalidateIconicBitmaps")
 | 
						|
	procDwmIsCompositionEnabled          = moddwmapi.NewProc("DwmIsCompositionEnabled")
 | 
						|
	procDwmModifyPreviousDxFrameDuration = moddwmapi.NewProc("DwmModifyPreviousDxFrameDuration")
 | 
						|
	procDwmQueryThumbnailSourceSize      = moddwmapi.NewProc("DwmQueryThumbnailSourceSize")
 | 
						|
	procDwmRegisterThumbnail             = moddwmapi.NewProc("DwmRegisterThumbnail")
 | 
						|
	procDwmRenderGesture                 = moddwmapi.NewProc("DwmRenderGesture")
 | 
						|
	procDwmSetDxFrameDuration            = moddwmapi.NewProc("DwmSetDxFrameDuration")
 | 
						|
	procDwmSetIconicLivePreviewBitmap    = moddwmapi.NewProc("DwmSetIconicLivePreviewBitmap")
 | 
						|
	procDwmSetIconicThumbnail            = moddwmapi.NewProc("DwmSetIconicThumbnail")
 | 
						|
	procDwmSetPresentParameters          = moddwmapi.NewProc("DwmSetPresentParameters")
 | 
						|
	procDwmSetWindowAttribute            = moddwmapi.NewProc("DwmSetWindowAttribute")
 | 
						|
	procDwmShowContact                   = moddwmapi.NewProc("DwmShowContact")
 | 
						|
	procDwmTetherContact                 = moddwmapi.NewProc("DwmTetherContact")
 | 
						|
	procDwmTransitionOwnedWindow         = moddwmapi.NewProc("DwmTransitionOwnedWindow")
 | 
						|
	procDwmUnregisterThumbnail           = moddwmapi.NewProc("DwmUnregisterThumbnail")
 | 
						|
	procDwmUpdateThumbnailProperties     = moddwmapi.NewProc("DwmUpdateThumbnailProperties")
 | 
						|
)
 | 
						|
 | 
						|
func DwmDefWindowProc(hWnd HWND, msg uint, wParam, lParam uintptr) (bool, uint) {
 | 
						|
	var result uint
 | 
						|
	ret, _, _ := procDwmDefWindowProc.Call(
 | 
						|
		uintptr(hWnd),
 | 
						|
		uintptr(msg),
 | 
						|
		wParam,
 | 
						|
		lParam,
 | 
						|
		uintptr(unsafe.Pointer(&result)))
 | 
						|
	return ret != 0, result
 | 
						|
}
 | 
						|
 | 
						|
func DwmEnableBlurBehindWindow(hWnd HWND, pBlurBehind *DWM_BLURBEHIND) HRESULT {
 | 
						|
	ret, _, _ := procDwmEnableBlurBehindWindow.Call(
 | 
						|
		uintptr(hWnd),
 | 
						|
		uintptr(unsafe.Pointer(pBlurBehind)))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
func DwmEnableMMCSS(fEnableMMCSS bool) HRESULT {
 | 
						|
	ret, _, _ := procDwmEnableMMCSS.Call(
 | 
						|
		uintptr(BoolToBOOL(fEnableMMCSS)))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
func DwmExtendFrameIntoClientArea(hWnd HWND, pMarInset *MARGINS) HRESULT {
 | 
						|
	ret, _, _ := procDwmExtendFrameIntoClientArea.Call(
 | 
						|
		uintptr(hWnd),
 | 
						|
		uintptr(unsafe.Pointer(pMarInset)))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
func DwmFlush() HRESULT {
 | 
						|
	ret, _, _ := procDwmFlush.Call()
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
func DwmGetColorizationColor(pcrColorization *uint32, pfOpaqueBlend *BOOL) HRESULT {
 | 
						|
	ret, _, _ := procDwmGetColorizationColor.Call(
 | 
						|
		uintptr(unsafe.Pointer(pcrColorization)),
 | 
						|
		uintptr(unsafe.Pointer(pfOpaqueBlend)))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
func DwmGetCompositionTimingInfo(hWnd HWND, pTimingInfo *DWM_TIMING_INFO) HRESULT {
 | 
						|
	ret, _, _ := procDwmGetCompositionTimingInfo.Call(
 | 
						|
		uintptr(hWnd),
 | 
						|
		uintptr(unsafe.Pointer(pTimingInfo)))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
func DwmGetTransportAttributes(pfIsRemoting *BOOL, pfIsConnected *BOOL, pDwGeneration *uint32) HRESULT {
 | 
						|
	ret, _, _ := procDwmGetTransportAttributes.Call(
 | 
						|
		uintptr(unsafe.Pointer(pfIsRemoting)),
 | 
						|
		uintptr(unsafe.Pointer(pfIsConnected)),
 | 
						|
		uintptr(unsafe.Pointer(pDwGeneration)))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
// TODO: verify handling of variable arguments
 | 
						|
func DwmGetWindowAttribute(hWnd HWND, dwAttribute uint32) (pAttribute interface{}, result HRESULT) {
 | 
						|
	var pvAttribute, pvAttrSize uintptr
 | 
						|
	switch dwAttribute {
 | 
						|
	case DWMWA_NCRENDERING_ENABLED:
 | 
						|
		v := new(BOOL)
 | 
						|
		pAttribute = v
 | 
						|
		pvAttribute = uintptr(unsafe.Pointer(v))
 | 
						|
		pvAttrSize = unsafe.Sizeof(*v)
 | 
						|
	case DWMWA_CAPTION_BUTTON_BOUNDS, DWMWA_EXTENDED_FRAME_BOUNDS:
 | 
						|
		v := new(RECT)
 | 
						|
		pAttribute = v
 | 
						|
		pvAttribute = uintptr(unsafe.Pointer(v))
 | 
						|
		pvAttrSize = unsafe.Sizeof(*v)
 | 
						|
	case DWMWA_CLOAKED:
 | 
						|
		panic(fmt.Sprintf("DwmGetWindowAttribute(%d) is not currently supported.", dwAttribute))
 | 
						|
	default:
 | 
						|
		panic(fmt.Sprintf("DwmGetWindowAttribute(%d) is not valid.", dwAttribute))
 | 
						|
	}
 | 
						|
 | 
						|
	ret, _, _ := procDwmGetWindowAttribute.Call(
 | 
						|
		uintptr(hWnd),
 | 
						|
		uintptr(dwAttribute),
 | 
						|
		pvAttribute,
 | 
						|
		pvAttrSize)
 | 
						|
	result = HRESULT(ret)
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
func DwmInvalidateIconicBitmaps(hWnd HWND) HRESULT {
 | 
						|
	ret, _, _ := procDwmInvalidateIconicBitmaps.Call(
 | 
						|
		uintptr(hWnd))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
func DwmIsCompositionEnabled(pfEnabled *BOOL) HRESULT {
 | 
						|
	ret, _, _ := procDwmIsCompositionEnabled.Call(
 | 
						|
		uintptr(unsafe.Pointer(pfEnabled)))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
func DwmModifyPreviousDxFrameDuration(hWnd HWND, cRefreshes int, fRelative bool) HRESULT {
 | 
						|
	ret, _, _ := procDwmModifyPreviousDxFrameDuration.Call(
 | 
						|
		uintptr(hWnd),
 | 
						|
		uintptr(cRefreshes),
 | 
						|
		uintptr(BoolToBOOL(fRelative)))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
func DwmQueryThumbnailSourceSize(hThumbnail HTHUMBNAIL, pSize *SIZE) HRESULT {
 | 
						|
	ret, _, _ := procDwmQueryThumbnailSourceSize.Call(
 | 
						|
		uintptr(hThumbnail),
 | 
						|
		uintptr(unsafe.Pointer(pSize)))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
func DwmRegisterThumbnail(hWndDestination HWND, hWndSource HWND, phThumbnailId *HTHUMBNAIL) HRESULT {
 | 
						|
	ret, _, _ := procDwmRegisterThumbnail.Call(
 | 
						|
		uintptr(hWndDestination),
 | 
						|
		uintptr(hWndSource),
 | 
						|
		uintptr(unsafe.Pointer(phThumbnailId)))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
func DwmRenderGesture(gt GESTURE_TYPE, cContacts uint, pdwPointerID *uint32, pPoints *POINT) {
 | 
						|
	procDwmRenderGesture.Call(
 | 
						|
		uintptr(gt),
 | 
						|
		uintptr(cContacts),
 | 
						|
		uintptr(unsafe.Pointer(pdwPointerID)),
 | 
						|
		uintptr(unsafe.Pointer(pPoints)))
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
func DwmSetDxFrameDuration(hWnd HWND, cRefreshes int) HRESULT {
 | 
						|
	ret, _, _ := procDwmSetDxFrameDuration.Call(
 | 
						|
		uintptr(hWnd),
 | 
						|
		uintptr(cRefreshes))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
func DwmSetIconicLivePreviewBitmap(hWnd HWND, hbmp HBITMAP, pptClient *POINT, dwSITFlags uint32) HRESULT {
 | 
						|
	ret, _, _ := procDwmSetIconicLivePreviewBitmap.Call(
 | 
						|
		uintptr(hWnd),
 | 
						|
		uintptr(hbmp),
 | 
						|
		uintptr(unsafe.Pointer(pptClient)),
 | 
						|
		uintptr(dwSITFlags))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
func DwmSetIconicThumbnail(hWnd HWND, hbmp HBITMAP, dwSITFlags uint32) HRESULT {
 | 
						|
	ret, _, _ := procDwmSetIconicThumbnail.Call(
 | 
						|
		uintptr(hWnd),
 | 
						|
		uintptr(hbmp),
 | 
						|
		uintptr(dwSITFlags))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
func DwmSetPresentParameters(hWnd HWND, pPresentParams *DWM_PRESENT_PARAMETERS) HRESULT {
 | 
						|
	ret, _, _ := procDwmSetPresentParameters.Call(
 | 
						|
		uintptr(hWnd),
 | 
						|
		uintptr(unsafe.Pointer(pPresentParams)))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
func DwmSetWindowAttribute(hWnd HWND, dwAttribute uint32, pvAttribute LPCVOID, cbAttribute uint32) HRESULT {
 | 
						|
	ret, _, _ := procDwmSetWindowAttribute.Call(
 | 
						|
		uintptr(hWnd),
 | 
						|
		uintptr(dwAttribute),
 | 
						|
		uintptr(pvAttribute),
 | 
						|
		uintptr(cbAttribute))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
func DwmShowContact(dwPointerID uint32, eShowContact DWM_SHOWCONTACT) {
 | 
						|
	procDwmShowContact.Call(
 | 
						|
		uintptr(dwPointerID),
 | 
						|
		uintptr(eShowContact))
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
func DwmTetherContact(dwPointerID uint32, fEnable bool, ptTether POINT) {
 | 
						|
	procDwmTetherContact.Call(
 | 
						|
		uintptr(dwPointerID),
 | 
						|
		uintptr(BoolToBOOL(fEnable)),
 | 
						|
		uintptr(unsafe.Pointer(&ptTether)))
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
func DwmTransitionOwnedWindow(hWnd HWND, target DWMTRANSITION_OWNEDWINDOW_TARGET) {
 | 
						|
	procDwmTransitionOwnedWindow.Call(
 | 
						|
		uintptr(hWnd),
 | 
						|
		uintptr(target))
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
func DwmUnregisterThumbnail(hThumbnailId HTHUMBNAIL) HRESULT {
 | 
						|
	ret, _, _ := procDwmUnregisterThumbnail.Call(
 | 
						|
		uintptr(hThumbnailId))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 | 
						|
 | 
						|
func DwmUpdateThumbnailProperties(hThumbnailId HTHUMBNAIL, ptnProperties *DWM_THUMBNAIL_PROPERTIES) HRESULT {
 | 
						|
	ret, _, _ := procDwmUpdateThumbnailProperties.Call(
 | 
						|
		uintptr(hThumbnailId),
 | 
						|
		uintptr(unsafe.Pointer(ptnProperties)))
 | 
						|
	return HRESULT(ret)
 | 
						|
}
 |