(摘) Webview 将浏览器作为golang的GUI

声明:内容源自网络,版权归原作者所有。若有侵权请在网页聊天中联系我

将浏览器作为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也需要进行窗口的控制。

相关文章