GTK3 - 如何将 window 发送到后台
GTK3 - How to send a window to the background
我正在尝试向后台发送一个 window,但是 SetKeepBelow
对 windows 没有任何影响。有什么办法可以做到这一点?我正在使用 golang 和 gotk3,但如果需要我可以添加额外的绑定。
另一个选项可能是使用这个:https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setwindowpos
但我不确定具体如何,因为我无法从 gtk 中检索 window 句柄。
所以,我找到了一个解决方案,就像问题评论中提到的那样,它很老套!但是,我不想让这个问题悬而未决。所以我正在做的是使用 windows 的 SetWindowPos
函数,以便在 z 轴上移动它。但是,为了能够这样做,您首先需要指向 hWnd
的指针,我正在使用 FindWindowA
检索它,它需要一个 classname 和一个 window title, sicne 我不知道class,我路过nil
。传递 nil
会导致函数仅按 windowtitle 进行搜索。 Ofc 此解决方案仅在您的 window 具有唯一标题时才有效!
package main
import (
"unsafe"
"github.com/gotk3/gotk3/gdk"
"github.com/gotk3/gotk3/gtk"
"golang.org/x/sys/windows"
)
var (
mod = windows.NewLazyDLL("user32.dll")
setWindowPosFunction = mod.NewProc("SetWindowPos")
findWindowFunction = mod.NewProc("FindWindowA")
)
//ToBackground moves the window to the background, preserving its size and position
func ToBackground(hwnd uintptr, gtkWindow *gtk.Window) error {
x, y := gtkWindow.GetPosition()
width, height := gtkWindow.GetSize()
_, _, err := setWindowPosFunction.Call(hwnd, uintptr(1), uintptr(x), uintptr(y), uintptr(width), uintptr(height), 0)
if err != nil && err.Error() == "The operation completed successfully." {
return nil
}
return err
}
func main() {
gtk.Init(nil)
window, _ := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
window.SetTypeHint(gdk.WINDOW_TYPE_HINT_UTILITY)
title := "unique-identifier"
window.SetTitle(title)
window.SetPosition(gtk.WIN_POS_CENTER)
window.ShowAll()
titleAsByteArray := []byte(title)
hwnd, _, windowRetrieveError := findWindowFunction.Call(0, uintptr(unsafe.Pointer(&titleAsByteArray[0])))
if windowRetrieveError != nil && windowRetrieveError.Error() != "The operation completed successfully." {
panic(windowRetrieveError)
}
toBackgroundError := ToBackground(hwnd, window)
if toBackgroundError != nil {
panic(toBackgroundError)
}
gtk.Main()
}
我正在尝试向后台发送一个 window,但是 SetKeepBelow
对 windows 没有任何影响。有什么办法可以做到这一点?我正在使用 golang 和 gotk3,但如果需要我可以添加额外的绑定。
另一个选项可能是使用这个:https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setwindowpos
但我不确定具体如何,因为我无法从 gtk 中检索 window 句柄。
所以,我找到了一个解决方案,就像问题评论中提到的那样,它很老套!但是,我不想让这个问题悬而未决。所以我正在做的是使用 windows 的 SetWindowPos
函数,以便在 z 轴上移动它。但是,为了能够这样做,您首先需要指向 hWnd
的指针,我正在使用 FindWindowA
检索它,它需要一个 classname 和一个 window title, sicne 我不知道class,我路过nil
。传递 nil
会导致函数仅按 windowtitle 进行搜索。 Ofc 此解决方案仅在您的 window 具有唯一标题时才有效!
package main
import (
"unsafe"
"github.com/gotk3/gotk3/gdk"
"github.com/gotk3/gotk3/gtk"
"golang.org/x/sys/windows"
)
var (
mod = windows.NewLazyDLL("user32.dll")
setWindowPosFunction = mod.NewProc("SetWindowPos")
findWindowFunction = mod.NewProc("FindWindowA")
)
//ToBackground moves the window to the background, preserving its size and position
func ToBackground(hwnd uintptr, gtkWindow *gtk.Window) error {
x, y := gtkWindow.GetPosition()
width, height := gtkWindow.GetSize()
_, _, err := setWindowPosFunction.Call(hwnd, uintptr(1), uintptr(x), uintptr(y), uintptr(width), uintptr(height), 0)
if err != nil && err.Error() == "The operation completed successfully." {
return nil
}
return err
}
func main() {
gtk.Init(nil)
window, _ := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
window.SetTypeHint(gdk.WINDOW_TYPE_HINT_UTILITY)
title := "unique-identifier"
window.SetTitle(title)
window.SetPosition(gtk.WIN_POS_CENTER)
window.ShowAll()
titleAsByteArray := []byte(title)
hwnd, _, windowRetrieveError := findWindowFunction.Call(0, uintptr(unsafe.Pointer(&titleAsByteArray[0])))
if windowRetrieveError != nil && windowRetrieveError.Error() != "The operation completed successfully." {
panic(windowRetrieveError)
}
toBackgroundError := ToBackground(hwnd, window)
if toBackgroundError != nil {
panic(toBackgroundError)
}
gtk.Main()
}