#
核心代码
gocopy codepackage setWindowTop /* #cgo windows LDFLAGS: -luser32 #include <windows.h> // 设置指定窗口置顶 void SetWindowTopmost(HWND hwnd, int topmost) { SetWindowPos(hwnd, topmost ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); } // 获取当前活动窗口 HWND GetActiveWindowHandle() { return GetForegroundWindow(); } */ import "C" import ( "log" "syscall" "unsafe" ) // NullHWND 定义空窗口句柄常量 var NullHWND = (C.HWND)(unsafe.Pointer(uintptr(0))) // FindWindowByTitle 根据窗口标题查找窗口句柄 func FindWindowByTitle(title string) C.HWND { user32 := syscall.MustLoadDLL("user32.dll") procFindWindow := user32.MustFindProc("FindWindowW") titlePtr, err := syscall.UTF16PtrFromString(title) if err != nil { log.Printf("转换窗口标题失败: %v", err) return NullHWND } hwnd, _, _ := procFindWindow.Call(0, uintptr(unsafe.Pointer(titlePtr))) return C.HWND(unsafe.Pointer(hwnd)) } // SetWindowTop 窗口置顶 func SetWindowTop(hwnd C.HWND) { C.SetWindowTopmost(hwnd, 1) } // SetWindowNoTop 取消窗口置顶 func SetWindowNoTop(hwnd C.HWND) { C.SetWindowTopmost(hwnd, 0) }
gocopy code// 使用一个唯一的窗口标题,便于后续查找 windowTitle := "Fyne置顶窗口示例_" + time.Now().Format("20060102150405") hwnd := setWindowTop.FindWindowByTitle(windowTitle) if hwnd == setWindowTop.NullHWND { log.Fatalf("未找到标题为 '%s' 的窗口", windowTitle) } fmt.Printf("找到窗口: %s (句柄: %d)\n", windowTitle, hwnd) setWindowTop.SetWindowTop(hwnd) fmt.Println("窗口已置顶")
#
全部代码
gocopy codepackage main import "C" import ( "fmt" "fyne-demo/setWindowTop" "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/driver/desktop" "fyne.io/fyne/v2/widget" "log" "time" ) func main() { // 使用一个唯一的窗口标题,便于后续查找 windowTitle := "Fyne置顶窗口示例_" + time.Now().Format("20060102150405") a := app.New() a.SetIcon(resourceIconPng) logLifecycle(a) drv := fyne.CurrentApp().Driver() if drv, ok := drv.(desktop.Driver); ok { // 无边框窗口 w := drv.CreateSplashWindow() w.SetTitle(windowTitle) w.Show() // 设置窗口内容 clock := widget.NewLabel("Clock") button := widget.NewButton("置顶", func() { hwnd := setWindowTop.FindWindowByTitle(windowTitle) if hwnd == setWindowTop.NullHWND { log.Fatalf("未找到标题为 '%s' 的窗口", windowTitle) } fmt.Printf("找到窗口: %s (句柄: %d)\n", windowTitle, hwnd) setWindowTop.SetWindowTop(hwnd) fmt.Println("窗口已置顶") }) button2 := widget.NewButton("取消置顶", func() { hwnd := setWindowTop.FindWindowByTitle(windowTitle) if hwnd == setWindowTop.NullHWND { log.Fatalf("未找到标题为 '%s' 的窗口", windowTitle) } fmt.Printf("找到窗口: %s (句柄: %d)\n", windowTitle, hwnd) setWindowTop.SetWindowNoTop(hwnd) fmt.Println("窗口已取消置顶") }) newVBox := container.NewVBox(clock, widget.NewSeparator(), button, button2) w.SetContent(newVBox) if desk, ok := a.(desktop.App); ok { m := fyne.NewMenu("MyApp", fyne.NewMenuItem("Show", func() { w.Show() }), fyne.NewMenuItem("Quit", func() { a.Quit() })) desk.SetSystemTrayIcon(resourceIconPng) desk.SetSystemTrayMenu(m) } //w.SetCloseIntercept(func() { // w.Hide() //}) } drv.Run() } func logLifecycle(a fyne.App) { a.Lifecycle().SetOnStarted(func() { log.Println("Lifecycle: Started") }) a.Lifecycle().SetOnStopped(func() { log.Println("Lifecycle: Stopped") }) a.Lifecycle().SetOnEnteredForeground(func() { log.Println("Lifecycle: Entered Foreground") }) a.Lifecycle().SetOnExitedForeground(func() { log.Println("Lifecycle: Exited Foreground") }) }
评论 (0 条)