将浏览器作为golang的GUI界面使用,外面可套层壳,也可直接控制。这解决了golang的前端短板,利用现成的HTML来完成交互部份。
例如这里使用webview: github.com/webview/webview。前后台的交互其实可以通过类似VUE来实现,当然它有自己的交互方式。
因为库较为简单,无法对套壳的窗口进行控制。在Win下,需要一些操作,例如窗口最大化,无窗口化,浮于顶层。发现可以使用 win库来进行。
库地址:github.com/lxn/win
看示例,这里有一些简单的结合。参考了网友文章,地址
package main
import (
"fmt"
"os/exec"
"runtime"
"time"
"github.com/lxn/win"
"github.com/webview/webview"
)
func main() {
debug := true
w := webview.New(debug)
defer w.Destroy()
w.SetTitle("Minimal webview example")
w.SetSize(800, 600, webview.HintNone)
w.Navigate("https://i.scwy.net")
hwnd := w.Window()
// 查找窗口
// hwnd, err = GetWindowHwndByName("firfox.exe")
// hWnd = win.HWND(unsafe.Pointer(hwnd))
// if IsMyWindowsHwnd(hWnd) {}
go func() {
time.Sleep(2 * time.Second)
hWnd := win.HWND(hwnd)
win.MoveWindow(hWnd, int32(10), int32(10), int32(200), int32(400), true) // 移动窗口位置和大小
win.SetWindowPos(hWnd, win.HWND_TOPMOST, 0, 0, 0, 0, win.SWP_NOMOVE|win.SWP_NOSIZE) // 置顶
//win.SetWindowPos(hWnd, win.HWND_NOTOPMOST, 0, 0, 0, 0, win.SWP_NOMOVE|win.SWP_NOSIZE) // 不置顶
// style &= ^win.WS_SIZEBOX & ^win.WS_CAPTION // 无边框
style := win.GetWindowLong(hWnd, win.GWL_STYLE) // 普通窗口样式
style |= win.WS_SIZEBOX | win.WS_CAPTION // 有边框
win.SetWindowLong(hWnd, win.GWL_STYLE, style) // 设置样式
win.SendMessage(hWnd, win.WM_KEYDOWN, 0x0000007A, 0x20380001) // 按下按键
win.SendMessage(hWnd, win.WM_KEYUP, 0x0000007A, 0x003C0001) // 抬起按键
}()
w.Run()
}
func OpenWithBrowser(url string) error {
switch runtime.GOOS {
case "linux":
return exec.Command("xdg-open", url).Start()
case "windows":
return exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start()
case "darwin":
return exec.Command("open", url).Start()
default:
return fmt.Errorf("runtime.GOOS %s is not supported", runtime.GOOS)
}
}
之前使用的lorca也需要进行窗口的控制。