GTK3 - Как отправить окно на задний план - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь отправить окно на задний план, но SetKeepBelow не влияет на окна. Есть ли способ добиться этого? Я использую golang и gotk3, но при необходимости могу добавить дополнительные привязки.

Другой вариант, вероятно, будет использовать это: https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setwindowpos

Но я не уверен, как именно, так как я не могу получить дескриптор окна из gtk.

1 Ответ

0 голосов
/ 05 сентября 2018

Итак, я нашел решение и, как уже упоминалось в комментариях к вопросам, оно взломано! Однако я не хотел оставлять это нерешенным. Поэтому я использую функцию SetWindowPos для перемещения окна по оси Z. Однако для того, чтобы сделать это, вам сначала нужен указатель на hWnd, я извлекаю его с помощью FindWindowA, который принимает имя класса и заголовок окна, так как я не знаю класс, я передаю nil. Передача nil заставляет функцию выполнять поиск только по заголовку окна. Ofc это решение работает только если ваше окно имеет уникальный заголовок!

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()
}
...