37 lines
1.1 KiB
Go
37 lines
1.1 KiB
Go
//go:build windows
|
|
|
|
package main
|
|
|
|
import "syscall"
|
|
|
|
// GetSystemMetrics indices for the virtual desktop — the rectangle spanning
|
|
// every attached monitor. Wails' ScreenGetAll reports each monitor's size but
|
|
// not its offset, so it cannot answer "is this coordinate on any screen?"; the
|
|
// Win32 metrics can.
|
|
const (
|
|
smXVirtualScreen = 76
|
|
smYVirtualScreen = 77
|
|
smCXVirtualScreen = 78
|
|
smCYVirtualScreen = 79
|
|
)
|
|
|
|
var (
|
|
user32Dll = syscall.NewLazyDLL("user32.dll")
|
|
procGetSystemMetrics = user32Dll.NewProc("GetSystemMetrics")
|
|
)
|
|
|
|
func systemMetric(index int) int {
|
|
r, _, _ := procGetSystemMetrics.Call(uintptr(index))
|
|
return int(int32(r)) // signed: the virtual desktop origin is negative with a monitor to the left
|
|
}
|
|
|
|
// virtualScreenBounds returns the rectangle covering all monitors, and whether
|
|
// it could be determined at all.
|
|
func virtualScreenBounds() (x, y, w, h int, ok bool) {
|
|
w, h = systemMetric(smCXVirtualScreen), systemMetric(smCYVirtualScreen)
|
|
if w <= 0 || h <= 0 {
|
|
return 0, 0, 0, 0, false
|
|
}
|
|
return systemMetric(smXVirtualScreen), systemMetric(smYVirtualScreen), w, h, true
|
|
}
|