49 lines
1.5 KiB
Go
49 lines
1.5 KiB
Go
//go:build cgo
|
||
|
||
package desktop
|
||
|
||
import (
|
||
"os"
|
||
"syscall"
|
||
"unsafe"
|
||
)
|
||
|
||
// Нативный максимум окна через Win32.
|
||
//
|
||
// Fyne (v2.6) не даёт ни Move, ни Maximize у fyne.Window, поэтому разворот на
|
||
// экран (над панелью задач) делаем напрямую через user32: находим HWND нашего
|
||
// процесса через EnumWindows и вызываем ShowWindow(SW_MAXIMIZE).
|
||
// Только Windows (платформа приложения по спеке — Windows).
|
||
|
||
const (
|
||
swMaximize = 9
|
||
)
|
||
|
||
var (
|
||
user32 = syscall.NewLazyDLL("user32.dll")
|
||
procEnumWindows = user32.NewProc("EnumWindows")
|
||
procGetWindowThreadProcID = user32.NewProc("GetWindowThreadProcessId")
|
||
procIsWindowVisible = user32.NewProc("IsWindowVisible")
|
||
procShowWindow = user32.NewProc("ShowWindow")
|
||
)
|
||
|
||
func maximizeWindow() {
|
||
pid := uint32(os.Getpid())
|
||
|
||
cb := syscall.NewCallback(func(hwnd syscall.Handle, _ uintptr) uintptr {
|
||
var winPid uint32
|
||
procGetWindowThreadProcID.Call(uintptr(hwnd), uintptr(unsafe.Pointer(&winPid)))
|
||
if winPid != pid {
|
||
return 1 // continue перечисление
|
||
}
|
||
visible, _, _ := procIsWindowVisible.Call(uintptr(hwnd))
|
||
if visible == 0 {
|
||
return 1 // continue перечисление
|
||
}
|
||
procShowWindow.Call(uintptr(hwnd), swMaximize)
|
||
return 0 // остановить перечисление
|
||
})
|
||
|
||
procEnumWindows.Call(cb, 0)
|
||
}
|