├── README.md ├── dll ├── gonode.dll └── node.dll ├── gowebui.go ├── miniblinkAPI.go └── miniblinkCommand.go /README.md: -------------------------------------------------------------------------------- 1 | # 关于本项目 2 | 基于github.com/weolar/miniblink49 封装的GOLANG使用的WebUI。 3 | 4 | 直接调用DLL,未使用CGO。 5 | 6 | 仅支持32位DLL。 7 | 8 | 9 | # 使用前准备 10 | 首先, go get github.com/selfplan/gowebui 11 | 12 | dll文件夹内有两个DLL文件,一个是 miniblink 的32位接口DLL。 13 | 14 | 大家可以自行到 https://github.com/weolar/miniblink49/releases 下载最新编译后的 dll 替换就行。(注意,名称一定得是 node.dll,后有说明) 15 | 16 | 另一个名称为 gonode.dll 是我自己编译的,主要用于解决GO和mb的DLL之前的调用问题,其中的问题有: 17 | 18 | 1、mb的DLL在返回值或者是回调函数里的参数值类型不为 int32 时,会导致GO接收后的结果不确定。(比如逻辑值应该是0和1,但GO接收到的都是一串数值) 19 | 20 | 2、mb需要GO回调函数返回值为bool型时,GO无论返回0或者1都是同样的效果。 21 | 22 | 对此,我猜想可能是GO调用DLL无论参数和返回类型都只能使用 uintptr 的原因。 23 | 24 | 如果有朋友知道原理并解决,望告知,谢谢! 25 | 26 | 所以,gonode.dll的作用就是为了处理一些GO和mbDLL之间传值的问题。 27 | 28 | 然后,应该没有其它要准备的了。 29 | 30 | 简而言之就是,把两个DLL放在同目录,再在你的代码中设置它们的位置。 31 | 32 | 33 | 另外,如果你的系统是 64位的,在首次编译或者构建时记得请先: 34 | set GOARCH=386 35 | 36 | # 如何使用 37 | 以下是一个简单且完整的显示一个浏览器窗口的代码: 38 | ```go 39 | package main 40 | 41 | import ( 42 | "gowebui" //引入包 43 | "strconv" 44 | ) 45 | 46 | var mb gowebui.WebView 47 | 48 | func main() { 49 | 50 | gowebui.Initialize("node.dll", "gonode.dll") //设置两个DLL的位置,我这里是两个DLL放在此demo源码文件内。 51 | gowebui.BindJsFunction("showalert", abcC, 99, 3) //绑定一个和网页JS交互的函数 52 | 53 | mb.CreateWebWindow("测试窗口", 0, 0, 0, 0, 700, 400) //创建一个标题为“测试窗口”,宽为700,高为400的窗口 54 | mb.ShowWindow(true) 55 | 56 | mb.LoadHTML(`测试窗口 57 | 点击打开百度
58 | 点击显示alert 59 | `) 60 | //加载一段HTML代码 61 | 62 | <-gowebui.Exit 等待MB窗口被关闭 63 | } 64 | 65 | //下面是被绑定的函数 66 | func abcC(es gowebui.JsExecState, param uintptr) uintptr { 67 | gowebui.StartCallBack() 68 | defer gowebui.EndCallBack() 69 | 70 | mb.RunJS("alert('链接被点击了,第1个参数为:" + mb.GetJsString(es, mb.GetJsValueFromArg(es, 0)) + "')") 71 | mb.RunJS("alert('链接被点击了,第2个参数为:" + strconv.Itoa(int(mb.GetJsInt(es, mb.GetJsValueFromArg(es, 1)))) + "')") 72 | 73 | if mb.GetJsBool(mb.GetJsValueFromArg(es, 2)) == true { 74 | mb.RunJS("alert('链接被点击了,第3个参数为:true')") 75 | } else { 76 | mb.RunJS("alert('链接被点击了,第3个参数为:false')") 77 | } 78 | return 0 79 | } 80 | ``` 81 | # 目前已实现公开接口 82 | 83 | 公开类型: 84 | type JsExecState int32
85 | type WkeWebView int32
86 | type JsValue string //使用文本来存长整型数字
87 | type HWnd int32
88 | type WkeString int32
89 | 90 | type WebView struct { 91 | hWnd HWnd 92 | hWebView WkeWebView 93 | } //此结构代表浏览窗口,见DEMO代码 94 | 95 | 96 | 公开包级接口: 97 | Initialize(mbPath, gonodePath string) bool //初始化,整个程序内只能在最开始时调用且只能调用一次
98 | StartCallBack() //回调函数开始时调用
99 | EndCallBack() //回调函数结束时调,可见上方DEMO代码
100 | 101 | 102 | WebView类型的方法: 103 | func (mb *WebView) SetMainHWND() //将当前窗口句柄设置为主窗口句柄,设置之后,如果此窗口被销毁,则所有窗口都被销毁。
104 | func (mb *WebView) GetWebTitle() string { //获取网页标题
105 | func (mb *WebView) SetWindowTitle(title string) { //设置WIN窗口标题
106 | func (mb *WebView) ShowWindow(visible bool) {
107 | func (mb *WebView) LoadURL(url string) { //加载网页地址
108 | func (mb *WebView) LoadHTML(html string) { //加载HTML
109 | func (mb *WebView) GetURL() string { //取网页地址
110 | func (mb *WebView) GetHWND() HWnd { //取WIN窗口句柄
111 | func (mb *WebView) SetSize(w, h uintptr) { //设置窗口宽高
112 | func (mb *WebView) MoveToCenter() { //将窗口居中
113 | func (mb *WebView) GetUserAgent() string { //取浏览器UA
114 | func (mb *WebView) GetCookie() string { //获取页面COOKIE
115 | func (mb *WebView) DOMReady() bool { //DOM文档结构是否加载完成
116 | func (mb *WebView) WkeStringToString(s WkeString) string { //WkeString 转 string
117 | func (mb *WebView) SetNavigationToNewWindow(y bool) { //设置点a标签后是在本窗口跳转还是新窗口跳转,相关可见 BindWillCreateWebWindow()
118 | func (mb *WebView) CanGoBack() bool { //是否可后退
119 | func (mb *WebView) CanGoForward() bool { //是否可前进
120 | func (mb *WebView) GoBack() { //后退
121 | func (mb *WebView) GoForward() { //前进
122 | func (mb *WebView) Reload() { //刷新
123 | 124 | 125 | //创建浏览器窗口
126 | //参数分别为 标题,类型(0带边框的可调窗口,1透明窗口,2子窗口;为2时,parent 必须设置),父窗口句柄,左边,顶边,宽,高
127 | func (mb *WebView) CreateWebWindow(title string, wkeWindowType, parent, x, y, width, height int32) WkeWebView {
128 | 129 | 130 | //HookRequest,在BindLoadUrlBegin 回调函数中使用,使用之后,如果对job设置了NetHookRequest,
131 | //则表示WebView会缓存获取到的网络数据,并在这次网络请求结束后调用BindLoadUrlEnd设置的回调函数,同时传递缓存的数据。在此期间,mb不会处理网络数据。
132 | func (mb *WebView) NetHookRequest(job uintptr) {
133 | 134 | 135 | //在BindLoadUrlBegin回调里调用,设置后,此请求将被取消。
136 | //参见 BindLoadUrlBegin 反返回值说明,个人尝试,返回值无效,需要取消连接的话,直接调用此方法
137 | func (mb *WebView) NetCancelRequest(job uintptr) {
138 | 139 | 140 | //绑定alert回调
141 | func (mb *WebView) BindAlertBox(f func(webView WkeWebView, param int32, url WkeString) uintptr, callbackParam int32) {
142 | 143 | 144 | //绑定URL改变回调
145 | func (mb *WebView) BindURLChanged(f func(webView WkeWebView, param int32, url WkeString) uintptr, callbackParam int32) {
146 | 147 | 148 | //绑定标题变化回调函数
149 | func (mb *WebView) BindTitleChanged(f func(webView WkeWebView, param int32, title WkeString) uintptr, callbackParam int32) {
150 | 151 | 152 | //网页准备浏览时触发此回调。
153 | //第三个回调的参数:0,表示点击a标签触发;1,点击form触发;2,前进后退触发;3,重新加载触发;4,表单重新提交;5,其它方式触发
154 | //回调函数返回 0 表示阻止本次浏览,1表示继续进行浏览 (见 NetCancelRequest() 方法说明)
155 | func (mb *WebView) BindNavigation(f func(webView WkeWebView, param int32, wkeNavigationType int32, url WkeString) uintptr, callbackParam int32) {
156 | 157 | 158 | //即将创建新浏览窗口
159 | //第一个参数为回调函数,第二个为处定义数据,将会出现在回调函数的 param 这个参数中。
160 | //回调函数的第3个参数见 BindNavigation() 说明。
161 | //返回值为 WkeWebView,表示使用该窗口来显示将创建的新的网页内容,返回自己的WkeWebView或者是关闭SetNavigationToNewWindow(),则使用本窗口加载新窗口内容
162 | func (mb *WebView) BindWillCreateWebWindow(f func(webView WkeWebView, param int32, wkeNavigationType int32, url WkeString, windowFeatures int32) uintptr, callbackParam int32) {
163 | 164 | 165 | //对应 对应js里的body onload事件
166 | //第一个参数为回调函数,第二个参数为自定义数据,将会出现在回调函数里的 param
167 | func (mb *WebView) BindDocumentReady(f func(webView WkeWebView, param int32) uintptr, callbackParam int32) {
168 | 169 | 170 | //对应 对应js里的body onload事件,不同之处是回调函数的第三个参数会传入当前 onload 事件的框架句柄
171 | //第一个参数为回调函数,第二个参数为自定义数据,将会出现在回调函数里的 param
172 | func (mb *WebView) BindDocumentReady2(f func(webView WkeWebView, param int32, frameId int32) uintptr, callbackParam int32) {
173 | 174 | 175 | //任何网络请求发起前会触发此回调,见 NetHookRequest() 说明
176 | func (mb *WebView) BindLoadUrlBegin(f func(webView WkeWebView, param int32, url_char, job uintptr) uintptr, callbackParam int32) {
177 | 178 | 179 | //见 NetHookRequest() 说明
180 | //第三个参数为当前数据的URL, 它是ANSI 编码的 CHAR(通常,如果里面只有ASCII字符的话,可直接 PtrToString() 转成GO的STRING型),第五个参数为数据指针位置,第六个为数据长度
181 | func (mb *WebView) BindLoadUrlEnd(f func(webView WkeWebView, param int32, url_char, job, buf, bufLen uintptr) uintptr, callbackParam int32) {
182 | 183 | 184 | //绑定一个全局函数到主frame的window上,必须在创建窗口前绑定,也就是在 miniblink.Initialize和mb.CreateWebWindow之间
185 | //第一个参数为JSfunc的名称;第二个为回调函数;第三个为自定义参数,可通过回调函数的第2个参数获取; 第四个为JSfunc的参数数量。
186 | func BindJsFunction(jsFuncName string, f func(es JsExecState, param uintptr) uintptr, param uintptr, argCount int32) {
187 | 188 | 189 | //用于JSfunc的回调函数,根据参数索引取得JSfunc传过来的值的 jsValue
190 | //第一个参数 使用回调函数的es参数,第二个参数为索引,从0开始
191 | func (mb *WebView) GetJsValueFromArg(es JsExecState, argIdx int32) JsValue {
192 | 193 | 194 | //获取页面主frame的jsExecState
195 | func (mb *WebView) GetExecState() JsExecState {
196 | 197 | 198 | //通过ES和JsValue将JS传过来的值转为string
199 | //es通过 GetExecState() 获取或者回调函数的es参数,jsValue通过 GetJsValue…… 之类的获取或者RunJS()返回值
200 | func (mb *WebView) GetJsString(es JsExecState, v JsValue) string {
201 | 202 | 203 | //通过ES和JsValue将JS传过来的值转为整数,如果v是个整形或者浮点,返回相应值(如果是浮点,返回取整后的值)。如果是其他类型,返回0(这里注意)
204 | //es通过 GetExecState() 获取或者回调函数的es参数,jsValue通过 GetJsValue…… 之类的获取或者RunJS()返回值
205 | func (mb *WebView) GetJsInt(es JsExecState, v JsValue) int32 {
206 | 207 | 208 | //通过ES和JsValue将JS传过来的值转为浮点型,如果v是个浮点型,返回相应值。如果是其他类型,返回0.0(这里注意)
209 | //es通过 GetExecState() 获取或者回调函数的es参数,jsValue通过 GetJsValue…… 之类的获取或者RunJS()返回值
210 | func (mb *WebView) GetJsFloat64(es JsExecState, v JsValue) float64 {
211 | 212 | 213 | //通过JsValue将JS传过来的值转为BOOL型,如果v本身是个布尔值,返回对应的true或者false;如果是个对象(JSTYPE_OBJECT),返回false(这里注意)
214 | //jsValue通过 GetJsValue…… 之类的获取或者RunJS()返回值
215 | func (mb *WebView) GetJsBool(v JsValue) bool {
216 | 217 | 218 | //让窗口执行JS代码,此代码是在一个 function(){} 中执行,如果要取返回值的话,需要加 return ;如 RunJS("return $('title').text()")
219 | //参数为JS脚本代码,返回值为 JsValue
220 | func (mb *WebView) RunJS(JsCode string) JsValue {
221 | 222 | 223 | 224 | -------------------------------------------------------------------------------- /dll/gonode.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/selfplan/gowebui/0ab5fe722ba02273d7a550c732e3896cfe87516c/dll/gonode.dll -------------------------------------------------------------------------------- /dll/node.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/selfplan/gowebui/0ab5fe722ba02273d7a550c732e3896cfe87516c/dll/node.dll -------------------------------------------------------------------------------- /gowebui.go: -------------------------------------------------------------------------------- 1 | package gowebui 2 | 3 | import ( 4 | "fmt" 5 | "runtime" 6 | "sync" 7 | "syscall" 8 | "unsafe" 9 | ) 10 | 11 | type JsExecState int32 12 | type WkeWebView int32 13 | type JsValue string //使用文本来存长整型数字 14 | type HWnd int32 15 | type WkeString int32 16 | 17 | var ( 18 | _dllCommand chan dllAPI 19 | _dllReturn chan interface{} 20 | _mhWnd HWnd //主窗口句柄 21 | _allhWnd map[HWnd]WkeWebView //存放所有句柄, 键:WIN窗口句柄,值:webView句柄 22 | Exit chan bool //所有操作完成,退出进程 23 | _lc sync.Mutex //操作回调函数记数 24 | 25 | _callBackNum uint32 //记录了运行的回调函数。(如果不为0,表示有操作是在回调函数里的,调用DLL时,需要判断线程) 26 | _mThreadId uint32 //主线程ID 27 | ) 28 | 29 | type dllAPI struct { 30 | hWebView WkeWebView 31 | apiStr string 32 | arg1 interface{} 33 | arg2 interface{} 34 | arg3 interface{} 35 | arg4 interface{} 36 | arg5 interface{} 37 | arg6 interface{} 38 | } 39 | 40 | type WebView struct { 41 | hWnd HWnd 42 | hWebView WkeWebView 43 | } 44 | 45 | //初始化,整个程序内只能在最开始时调用且只能调用一次 46 | func Initialize(mbPath, gonodePath string) bool { 47 | loadMBDLL(mbPath, gonodePath) 48 | _dllCommand = make(chan dllAPI) 49 | _dllReturn = make(chan interface{}) 50 | Exit = make(chan bool) 51 | _allhWnd = make(map[HWnd]WkeWebView) 52 | go func() { 53 | runtime.LockOSThread() 54 | _mThreadId = getCurrentThreadId() 55 | for { 56 | 57 | select { 58 | case dllCommand := <-_dllCommand: 59 | switch dllCommand.apiStr { 60 | case "wkeOnWindowDestroy": 61 | f1 := syscall.NewCallbackCDecl(dllCommand.arg1.(func(uintptr) uintptr)) 62 | ret, _, _ := syscall.Syscall(dllWkeOnWindowDestroy, 3, uintptr(dllCommand.hWebView), uintptr(unsafe.Pointer(f1)), 0) 63 | _dllReturn <- ret 64 | case "wkeJsBindFunction": 65 | f1 := syscall.NewCallbackCDecl(dllCommand.arg2.(func(JsExecState, uintptr) uintptr)) 66 | ret, _, _ := syscall.Syscall6(dllWkeJsBindFunction, 4, strToPtr(dllCommand.arg1.(string)), f1, dllCommand.arg3.(uintptr), uintptr(dllCommand.arg4.(int32)), 0, 0) 67 | _dllReturn <- ret 68 | case "wkeOnURLChanged": 69 | f1 := syscall.NewCallbackCDecl(dllCommand.arg1.(func(WkeWebView, int32, WkeString) uintptr)) 70 | ret, _, _ := syscall.Syscall(dllWkeOnURLChanged, 3, uintptr(dllCommand.hWebView), f1, int32ToPtr(dllCommand.arg2.(int32))) 71 | _dllReturn <- ret 72 | case "wkeOnAlertBox": 73 | f1 := syscall.NewCallbackCDecl(dllCommand.arg1.(func(WkeWebView, int32, WkeString) uintptr)) 74 | ret, _, _ := syscall.Syscall(dllWkeOnAlertBox, 3, uintptr(dllCommand.hWebView), f1, int32ToPtr(dllCommand.arg2.(int32))) 75 | _dllReturn <- ret 76 | case "wkeOnTitleChanged": 77 | f1 := syscall.NewCallbackCDecl(dllCommand.arg1.(func(WkeWebView, int32, WkeString) uintptr)) 78 | ret, _, _ := syscall.Syscall(dllWkeOnTitleChanged, 3, uintptr(dllCommand.hWebView), f1, int32ToPtr(dllCommand.arg2.(int32))) 79 | _dllReturn <- ret 80 | case "wkeOnNavigation": 81 | f1 := syscall.NewCallback(dllCommand.arg1.(func(WkeWebView, int32, int32, WkeString) uintptr)) 82 | ret, _, _ := syscall.Syscall(GOBindNavigation, 3, uintptr(dllCommand.hWebView), f1, int32ToPtr(dllCommand.arg2.(int32))) 83 | _dllReturn <- ret 84 | case "wkeOnCreateView": 85 | f1 := syscall.NewCallback(dllCommand.arg1.(func(WkeWebView, int32, int32, WkeString, int32) uintptr)) 86 | ret, _, _ := syscall.Syscall(GOBindCreateView, 3, uintptr(dllCommand.hWebView), f1, int32ToPtr(dllCommand.arg2.(int32))) 87 | _dllReturn <- ret 88 | case "wkeOnDocumentReady": 89 | f1 := syscall.NewCallbackCDecl(dllCommand.arg1.(func(WkeWebView, int32) uintptr)) 90 | ret, _, _ := syscall.Syscall(dllWkeOnDocumentReady, 3, uintptr(dllCommand.hWebView), f1, int32ToPtr(dllCommand.arg2.(int32))) 91 | _dllReturn <- ret 92 | case "wkeOnDocumentReady2": 93 | f1 := syscall.NewCallbackCDecl(dllCommand.arg1.(func(WkeWebView, int32, int32) uintptr)) 94 | ret, _, _ := syscall.Syscall(dllWkeOnDocumentReady2, 3, uintptr(dllCommand.hWebView), f1, int32ToPtr(dllCommand.arg2.(int32))) 95 | _dllReturn <- ret 96 | case "wkeOnLoadUrlBegin": 97 | f1 := syscall.NewCallback(dllCommand.arg1.(func(WkeWebView, int32, uintptr, uintptr) uintptr)) 98 | ret, _, _ := syscall.Syscall(GOBindLoadUrlBegin, 3, uintptr(dllCommand.hWebView), f1, int32ToPtr(dllCommand.arg2.(int32))) 99 | _dllReturn <- ret 100 | case "wkeOnLoadUrlEnd": 101 | f1 := syscall.NewCallbackCDecl(dllCommand.arg1.(func(WkeWebView, int32, uintptr, uintptr, uintptr, uintptr) uintptr)) 102 | ret, _, _ := syscall.Syscall(dllWkeOnLoadUrlEnd, 3, uintptr(dllCommand.hWebView), f1, int32ToPtr(dllCommand.arg2.(int32))) 103 | _dllReturn <- ret 104 | 105 | case "Exit": 106 | postQuitMessage(0) 107 | default: 108 | _dllReturn <- miniblinkCommand(dllCommand.hWebView, dllCommand.apiStr, dllCommand.arg1, dllCommand.arg2, dllCommand.arg3, dllCommand.arg4, dllCommand.arg5, dllCommand.arg6) 109 | } 110 | default: 111 | var msg msg 112 | if peekMessage(&msg, 0, 0, 0, 1) { 113 | translateMessage(&msg) 114 | dispatchMessage(&msg) 115 | if msg.Message == WM_QUIT { 116 | goto Loop 117 | } 118 | } 119 | } 120 | } 121 | 122 | Loop: 123 | fmt.Println("Go OUT!") 124 | freeMBDLL() //卸载DLL 125 | Exit <- true 126 | 127 | }() 128 | 129 | var api dllAPI 130 | api.apiStr = "wkeIsInitialize" 131 | _dllCommand <- api 132 | ret := <-_dllReturn 133 | 134 | if ret != 1 { 135 | api.apiStr = "wkeInitialize" 136 | _dllCommand <- api 137 | ret = <-_dllReturn 138 | 139 | } 140 | api.apiStr = "wkeIsInitialize" 141 | _dllCommand <- api 142 | ret = <-_dllReturn 143 | fmt.Println(ret) 144 | return (ret == 1) 145 | } 146 | 147 | //将当前窗口句柄设置为主窗口句柄,设置之后,如果此窗口被销毁,则所有窗口都被销毁。 148 | func (mb *WebView) SetMainHWND() { 149 | _mhWnd = mb.hWnd 150 | } 151 | 152 | //窗口将被销毁回调 153 | func (mb *WebView) wkeOnWindowDestroy(wkeWebView uintptr) uintptr { 154 | StartCallBack() 155 | defer EndCallBack() 156 | fmt.Println("将被销毁,", mb.hWnd, _mhWnd, mb.hWebView) 157 | if mb.hWnd == _mhWnd { 158 | //为主窗口被销毁 159 | 160 | var api dllAPI 161 | api.apiStr = "Exit" 162 | callDLLAPI(api) 163 | } else { 164 | //普通窗口被销毁 165 | delete(_allhWnd, mb.hWnd) 166 | } 167 | return 0 168 | } 169 | 170 | //获取网页标题 171 | func (mb *WebView) GetWebTitle() string { 172 | var api dllAPI 173 | api.hWebView = mb.hWebView 174 | api.apiStr = "wkeGetTitle" 175 | ret := callDLLAPI(api) 176 | 177 | return ret.(string) 178 | } 179 | 180 | //设置WIN窗口标题 181 | func (mb *WebView) SetWindowTitle(title string) { 182 | var api dllAPI 183 | api.apiStr = "wkeSetWindowTitle" 184 | api.hWebView = mb.hWebView 185 | api.arg1 = title 186 | callDLLAPI(api) 187 | } 188 | 189 | //显示窗口 190 | func (mb *WebView) ShowWindow(visible bool) { 191 | var api dllAPI 192 | api.hWebView = mb.hWebView 193 | api.apiStr = "wkeShowWindow" 194 | if visible == true { 195 | api.arg1 = uintptr(1) 196 | } else { 197 | api.arg1 = uintptr(0) 198 | } 199 | 200 | callDLLAPI(api) 201 | } 202 | 203 | //加载网页地址 204 | func (mb *WebView) LoadURL(url string) { 205 | var api dllAPI 206 | api.apiStr = "wkeLoadURL" 207 | api.hWebView = mb.hWebView 208 | api.arg1 = url 209 | callDLLAPI(api) 210 | } 211 | 212 | //加载HTML 213 | func (mb *WebView) LoadHTML(html string) { 214 | var api dllAPI 215 | api.apiStr = "wkeLoadHTML" 216 | api.hWebView = mb.hWebView 217 | api.arg1 = html 218 | callDLLAPI(api) 219 | } 220 | 221 | //取网页地址 222 | func (mb *WebView) GetURL() string { 223 | var api dllAPI 224 | api.apiStr = "wkeGetURL" 225 | api.hWebView = mb.hWebView 226 | ret := callDLLAPI(api) 227 | return ret.(string) 228 | } 229 | 230 | //取WIN窗口句柄 231 | func (mb *WebView) GetHWND() HWnd { 232 | return mb.hWnd 233 | } 234 | 235 | //设置窗口宽高 236 | func (mb *WebView) SetSize(w, h uintptr) { 237 | var api dllAPI 238 | api.apiStr = "wkeResize" 239 | api.hWebView = mb.hWebView 240 | api.arg1 = w 241 | api.arg2 = h 242 | callDLLAPI(api) 243 | } 244 | 245 | //将窗口居中 246 | func (mb *WebView) MoveToCenter() { 247 | var api dllAPI 248 | api.apiStr = "wkeMoveToCenter" 249 | api.hWebView = mb.hWebView 250 | callDLLAPI(api) 251 | } 252 | 253 | //获取浏览器UA 254 | func (mb *WebView) GetUserAgent() string { 255 | var api dllAPI 256 | api.apiStr = "wkeGetUserAgent" 257 | api.hWebView = mb.hWebView 258 | ret := callDLLAPI(api) 259 | return ret.(string) 260 | } 261 | 262 | //获取页面COOKIE 263 | func (mb *WebView) GetCookie() string { 264 | var api dllAPI 265 | api.apiStr = "wkeGetCookie" 266 | api.hWebView = mb.hWebView 267 | ret := callDLLAPI(api) 268 | return ret.(string) 269 | } 270 | 271 | //DOM文档结构是否加载完成 272 | func (mb *WebView) DOMReady() bool { 273 | var api dllAPI 274 | api.apiStr = "wkeIsDocumentReady" 275 | api.hWebView = mb.hWebView 276 | ret := callDLLAPI(api) 277 | return ret.(bool) 278 | } 279 | 280 | //WkeString 转 string 281 | func (mb *WebView) WkeStringToString(s WkeString) string { 282 | var api dllAPI 283 | api.apiStr = "wkeGetString" 284 | api.arg1 = s 285 | ret := callDLLAPI(api) 286 | return ret.(string) 287 | 288 | } 289 | 290 | //设置点a标签后是在本窗口跳转还是新窗口跳转,相关可见 BindWillCreateWebWindow() 291 | func (mb *WebView) SetNavigationToNewWindow(y bool) { 292 | var api dllAPI 293 | api.apiStr = "wkeSetNavigationToNewWindowEnable" 294 | api.hWebView = mb.hWebView 295 | if y { 296 | api.arg1 = uintptr(1) 297 | } else { 298 | api.arg1 = uintptr(0) 299 | } 300 | callDLLAPI(api) 301 | } 302 | 303 | //是否可后退 304 | func (mb *WebView) CanGoBack() bool { 305 | var api dllAPI 306 | api.apiStr = "wkeCanGoBack" 307 | api.hWebView = mb.hWebView 308 | ret := callDLLAPI(api) 309 | return ret.(bool) 310 | } 311 | 312 | //是否可前进 313 | func (mb *WebView) CanGoForward() bool { 314 | var api dllAPI 315 | api.apiStr = "wkeCanGoForward" 316 | api.hWebView = mb.hWebView 317 | ret := callDLLAPI(api) 318 | return ret.(bool) 319 | } 320 | 321 | //后退 322 | func (mb *WebView) GoBack() { 323 | var api dllAPI 324 | api.apiStr = "wkeGoBack" 325 | api.hWebView = mb.hWebView 326 | callDLLAPI(api) 327 | } 328 | 329 | //前进 330 | func (mb *WebView) GoForward() { 331 | var api dllAPI 332 | api.apiStr = "wkeGoForward" 333 | api.hWebView = mb.hWebView 334 | callDLLAPI(api) 335 | } 336 | 337 | //刷新 338 | func (mb *WebView) Reload() { 339 | var api dllAPI 340 | api.apiStr = "wkeReload" 341 | api.hWebView = mb.hWebView 342 | callDLLAPI(api) 343 | } 344 | 345 | //创建浏览器窗口 346 | //参数分别为 标题,类型(0带边框的可调窗口,1透明窗口,2子窗口;为2时,parent 必须设置),父窗口句柄,左边,顶边,宽,高 347 | func (mb *WebView) CreateWebWindow(title string, wkeWindowType, parent, x, y, width, height int32) WkeWebView { 348 | var api dllAPI 349 | api.apiStr = "wkeCreateWebWindow" 350 | api.arg1 = wkeWindowType 351 | api.arg2 = parent 352 | api.arg3 = x 353 | api.arg4 = y 354 | api.arg5 = width 355 | api.arg6 = height 356 | 357 | ret := callDLLAPI(api) 358 | mb.hWebView = ret.(WkeWebView) 359 | api.apiStr = "wkeGetWindowHandle" 360 | api.hWebView = mb.hWebView 361 | mb.hWnd = callDLLAPI(api).(HWnd) 362 | 363 | api.apiStr = "wkeOnWindowDestroy" 364 | api.hWebView = mb.hWebView 365 | api.arg1 = mb.wkeOnWindowDestroy 366 | callDLLAPI(api) 367 | 368 | _allhWnd[mb.hWnd] = mb.hWebView 369 | if _mhWnd == 0 { 370 | _mhWnd = mb.hWnd //默认将第一个窗口设为主窗口 371 | } 372 | 373 | api.apiStr = "wkeSetWindowTitle" 374 | api.hWebView = mb.hWebView 375 | api.arg1 = title 376 | callDLLAPI(api) 377 | return ret.(WkeWebView) 378 | } 379 | 380 | //以下为 NET 相关接口 381 | 382 | //HookRequest,在BindLoadUrlBegin 回调函数中使用,使用之后,如果对job设置了NetHookRequest, 383 | //则表示WebView会缓存获取到的网络数据,并在这次网络请求结束后调用BindLoadUrlEnd设置的回调函数,同时传递缓存的数据。在此期间,mb不会处理网络数据。 384 | func (mb *WebView) NetHookRequest(job uintptr) { 385 | var api dllAPI 386 | api.apiStr = "wkeNetHookRequest" 387 | api.arg1 = job 388 | callDLLAPI(api) 389 | } 390 | 391 | //在BindLoadUrlBegin回调里调用,设置后,此请求将被取消。 392 | //参见 BindLoadUrlBegin 反返回值说明,个人尝试,返回值无效,需要取消连接的话,直接调用此方法 393 | func (mb *WebView) NetCancelRequest(job uintptr) { 394 | var api dllAPI 395 | api.apiStr = "wkeNetCancelRequest" 396 | api.arg1 = job 397 | callDLLAPI(api) 398 | } 399 | 400 | //以下为有回调函数的事件 401 | //绑定alert回调 402 | func (mb *WebView) BindAlertBox(f func(webView WkeWebView, param int32, url WkeString) uintptr, callbackParam int32) { 403 | var api dllAPI 404 | api.apiStr = "wkeOnAlertBox" 405 | api.hWebView = mb.hWebView 406 | api.arg1 = f 407 | api.arg2 = callbackParam 408 | callDLLAPI(api) 409 | } 410 | 411 | //绑定URL改变回调 412 | func (mb *WebView) BindURLChanged(f func(webView WkeWebView, param int32, url WkeString) uintptr, callbackParam int32) { 413 | var api dllAPI 414 | api.apiStr = "wkeOnURLChanged" 415 | api.hWebView = mb.hWebView 416 | api.arg1 = f 417 | api.arg2 = callbackParam 418 | callDLLAPI(api) 419 | } 420 | 421 | //绑定标题变化回调函数 422 | func (mb *WebView) BindTitleChanged(f func(webView WkeWebView, param int32, title WkeString) uintptr, callbackParam int32) { 423 | var api dllAPI 424 | api.apiStr = "wkeOnTitleChanged" 425 | api.hWebView = mb.hWebView 426 | api.arg1 = f 427 | api.arg2 = callbackParam 428 | callDLLAPI(api) 429 | } 430 | 431 | //网页准备浏览时触发此回调。 432 | //第三个回调的参数:0,表示点击a标签触发;1,点击form触发;2,前进后退触发;3,重新加载触发;4,表单重新提交;5,其它方式触发 433 | //回调函数返回 0 表示阻止本次浏览,1表示继续进行浏览 (见 NetCancelRequest() 方法说明) 434 | func (mb *WebView) BindNavigation(f func(webView WkeWebView, param int32, wkeNavigationType int32, url WkeString) uintptr, callbackParam int32) { 435 | var api dllAPI 436 | api.apiStr = "wkeOnNavigation" 437 | api.hWebView = mb.hWebView 438 | api.arg1 = f 439 | api.arg2 = callbackParam 440 | callDLLAPI(api) 441 | } 442 | 443 | //即将创建新浏览窗口 444 | //第一个参数为回调函数,第二个为处定义数据,将会出现在回调函数的 param 这个参数中。 445 | //回调函数的第3个参数见 BindNavigation() 说明。 446 | //返回值为 WkeWebView,表示使用该窗口来显示将创建的新的网页内容,返回自己的WkeWebView或者是关闭SetNavigationToNewWindow(),则使用本窗口加载新窗口内容 447 | func (mb *WebView) BindWillCreateWebWindow(f func(webView WkeWebView, param int32, wkeNavigationType int32, url WkeString, windowFeatures int32) uintptr, callbackParam int32) { 448 | var api dllAPI 449 | api.apiStr = "wkeOnCreateView" 450 | api.hWebView = mb.hWebView 451 | api.arg1 = f 452 | api.arg2 = callbackParam 453 | callDLLAPI(api) 454 | } 455 | 456 | //对应 对应js里的body onload事件 457 | //第一个参数为回调函数,第二个参数为自定义数据,将会出现在回调函数里的 param 458 | func (mb *WebView) BindDocumentReady(f func(webView WkeWebView, param int32) uintptr, callbackParam int32) { 459 | var api dllAPI 460 | api.apiStr = "wkeOnDocumentReady" 461 | api.hWebView = mb.hWebView 462 | api.arg1 = f 463 | api.arg2 = callbackParam 464 | callDLLAPI(api) 465 | } 466 | 467 | //对应 对应js里的body onload事件,不同之处是回调函数的第三个参数会传入当前 onload 事件的框架句柄 468 | //第一个参数为回调函数,第二个参数为自定义数据,将会出现在回调函数里的 param 469 | func (mb *WebView) BindDocumentReady2(f func(webView WkeWebView, param int32, frameId int32) uintptr, callbackParam int32) { 470 | var api dllAPI 471 | api.apiStr = "wkeOnDocumentReady2" 472 | api.hWebView = mb.hWebView 473 | api.arg1 = f 474 | api.arg2 = callbackParam 475 | callDLLAPI(api) 476 | } 477 | 478 | //任何网络请求发起前会触发此回调,见 NetHookRequest() 说明 479 | func (mb *WebView) BindLoadUrlBegin(f func(webView WkeWebView, param int32, url_char, job uintptr) uintptr, callbackParam int32) { 480 | var api dllAPI 481 | api.apiStr = "wkeOnLoadUrlBegin" 482 | api.hWebView = mb.hWebView 483 | api.arg1 = f 484 | api.arg2 = callbackParam 485 | callDLLAPI(api) 486 | } 487 | 488 | //见 NetHookRequest() 说明 489 | //第三个参数为当前数据的URL, 它是ANSI 编码的 CHAR(通常,如果里面只有ASCII字符的话,可直接 PtrToString() 转成GO的STRING型),第五个参数为数据指针位置,第六个为数据长度 490 | func (mb *WebView) BindLoadUrlEnd(f func(webView WkeWebView, param int32, url_char, job, buf, bufLen uintptr) uintptr, callbackParam int32) { 491 | var api dllAPI 492 | api.apiStr = "wkeOnLoadUrlEnd" 493 | api.hWebView = mb.hWebView 494 | api.arg1 = f 495 | api.arg2 = callbackParam 496 | callDLLAPI(api) 497 | } 498 | 499 | //以下为JS相关接口 500 | //绑定一个全局函数到主frame的window上,必须在创建窗口前绑定,也就是在 miniblink.Initialize和mb.CreateWebWindow之间 501 | //第一个参数为JSfunc的名称;第二个为回调函数;第三个为自定义参数,可通过回调函数的第2个参数获取; 第四个为JSfunc的参数数量。 502 | func BindJsFunction(jsFuncName string, f func(es JsExecState, param uintptr) uintptr, param uintptr, argCount int32) { 503 | var api dllAPI 504 | api.apiStr = "wkeJsBindFunction" 505 | api.arg1 = jsFuncName 506 | api.arg2 = f 507 | api.arg3 = param 508 | api.arg4 = argCount 509 | callDLLAPI(api) 510 | 511 | } 512 | 513 | //用于JSfunc的回调函数,根据参数索引取得JSfunc传过来的值的 jsValue 514 | //第一个参数 使用回调函数的es参数,第二个参数为索引,从0开始 515 | func (mb *WebView) GetJsValueFromArg(es JsExecState, argIdx int32) JsValue { 516 | var api dllAPI 517 | api.apiStr = "jsArg" 518 | api.arg1 = es 519 | api.arg2 = argIdx 520 | ret := callDLLAPI(api) 521 | return ret.(JsValue) 522 | 523 | } 524 | 525 | //获取页面主frame的jsExecState 526 | func (mb *WebView) GetExecState() JsExecState { 527 | var api dllAPI 528 | api.apiStr = "wkeGlobalExec" 529 | api.hWebView = mb.hWebView 530 | return callDLLAPI(api).(JsExecState) 531 | } 532 | 533 | //通过ES和JsValue将JS传过来的值转为string 534 | //es通过 GetExecState() 获取或者回调函数的es参数,jsValue通过 GetJsValue…… 之类的获取或者RunJS()返回值 535 | func (mb *WebView) GetJsString(es JsExecState, v JsValue) string { 536 | var api dllAPI 537 | api.apiStr = "jsToString" 538 | api.arg1 = es 539 | api.arg2 = v 540 | ret := callDLLAPI(api) 541 | return ret.(string) 542 | } 543 | 544 | //通过ES和JsValue将JS传过来的值转为整数,如果v是个整形或者浮点,返回相应值(如果是浮点,返回取整后的值)。如果是其他类型,返回0(这里注意) 545 | //es通过 GetExecState() 获取或者回调函数的es参数,jsValue通过 GetJsValue…… 之类的获取或者RunJS()返回值 546 | func (mb *WebView) GetJsInt(es JsExecState, v JsValue) int32 { 547 | var api dllAPI 548 | api.apiStr = "jsToInt" 549 | api.arg1 = es 550 | api.arg2 = v 551 | ret := callDLLAPI(api) 552 | return ret.(int32) 553 | } 554 | 555 | //通过ES和JsValue将JS传过来的值转为浮点型,如果v是个浮点型,返回相应值。如果是其他类型,返回0.0(这里注意) 556 | //es通过 GetExecState() 获取或者回调函数的es参数,jsValue通过 GetJsValue…… 之类的获取或者RunJS()返回值 557 | func (mb *WebView) GetJsFloat64(es JsExecState, v JsValue) float64 { 558 | var api dllAPI 559 | api.apiStr = "jsToDouble" 560 | api.arg1 = es 561 | api.arg2 = v 562 | ret := callDLLAPI(api) 563 | return ret.(float64) 564 | } 565 | 566 | //通过JsValue将JS传过来的值转为BOOL型,如果v本身是个布尔值,返回对应的true或者false;如果是个对象(JSTYPE_OBJECT),返回false(这里注意) 567 | //jsValue通过 GetJsValue…… 之类的获取或者RunJS()返回值 568 | func (mb *WebView) GetJsBool(v JsValue) bool { 569 | var api dllAPI 570 | api.apiStr = "jsIsTrue" 571 | api.arg1 = v 572 | ret := callDLLAPI(api) 573 | return ret.(bool) 574 | } 575 | 576 | //让窗口执行JS代码,此代码是在一个 function(){} 中执行,如果要取返回值的话,需要加 return ;如 RunJS("return $('title').text()") 577 | //参数为JS脚本代码,返回值为 JsValue 578 | func (mb *WebView) RunJS(JsCode string) JsValue { 579 | var api dllAPI 580 | api.apiStr = "wkeRunJS" 581 | api.hWebView = mb.hWebView 582 | api.arg1 = JsCode 583 | ret := callDLLAPI(api) 584 | return ret.(JsValue) 585 | } 586 | 587 | //内部支持 588 | //调用DLL,主要解决在回调函数里操作时,channel 死锁的问题 589 | func callDLLAPI(api dllAPI) interface{} { 590 | _lc.Lock() 591 | callBackNum := _callBackNum 592 | _lc.Unlock() 593 | if callBackNum > 0 { 594 | //表示有操作是在回调函数里进行的 595 | if _mThreadId == getCurrentThreadId() { 596 | //当前在主线程,表示此操作是在回调里进行的 597 | switch api.apiStr { 598 | case "Exit": 599 | postQuitMessage(0) 600 | return 0 601 | default: 602 | return miniblinkCommand(api.hWebView, api.apiStr, api.arg1, api.arg2, api.arg3, api.arg4, api.arg5, api.arg6) 603 | } 604 | } else { 605 | //非回调里进行的 606 | _dllCommand <- api 607 | 608 | return <-_dllReturn 609 | } 610 | } else { 611 | //非回调里进行的 612 | _dllCommand <- api 613 | return <-_dllReturn 614 | } 615 | 616 | } 617 | 618 | //回调函数开始时调用 619 | func StartCallBack() { 620 | _lc.Lock() 621 | defer _lc.Unlock() 622 | _callBackNum++ 623 | } 624 | 625 | //回调函数结束时调用 626 | func EndCallBack() { 627 | _lc.Lock() 628 | defer _lc.Unlock() 629 | _callBackNum-- 630 | } 631 | -------------------------------------------------------------------------------- /miniblinkAPI.go: -------------------------------------------------------------------------------- 1 | package gowebui 2 | 3 | import ( 4 | "syscall" 5 | ) 6 | 7 | const ( 8 | WKE_LBUTTON = 1 9 | WKE_RBUTTON = 2 10 | WKE_SHIFT = 4 11 | WKE_CONTROL = 8 12 | WKE_MBUTTON = 16 13 | 14 | WM_PAINT = 15 15 | WM_SIZE = 5 16 | WM_QUIT = 18 17 | WM_KEYDOWN = 256 18 | WM_KEYUP = 257 19 | WM_CHAR = 258 20 | WM_LBUTTONDOWN = 513 21 | WM_MBUTTONDOWN = 519 22 | WM_RBUTTONDOWN = 516 23 | WM_LBUTTONDBLCLK = 515 24 | WM_MBUTTONDBLCLK = 521 25 | WM_RBUTTONDBLCLK = 518 26 | WM_LBUTTONUP = 514 27 | WM_MBUTTONUP = 520 28 | WM_RBUTTONUP = 517 29 | WM_MOUSEMOVE = 512 30 | MK_CONTROL = 8 31 | MK_SHIFT = 4 32 | MK_LBUTTON = 1 33 | MK_MBUTTON = 16 34 | MK_RBUTTON = 2 35 | WM_CONTEXTMENU = 123 36 | WM_MOUSEWHEEL = 522 37 | WM_SETFOCUS = 7 38 | WM_KILLFOCUS = 8 39 | WM_IME_STARTCOMPOSITION = 269 40 | CFS_EXCLUDE = 128 41 | WS_CHILD = 1073741824 42 | WS_VISIBLE = 268435456 43 | SS_NOTIFY = 256 44 | WS_EX_LAYERED = 524288 45 | WM_NCHITTEST = 132 46 | WM_GETMINMAXINFO = 36 47 | HTTOP = 12 48 | HTLEFT = 10 49 | HTRIGHT = 11 50 | HTBOTTOM = 15 51 | HTTOPLEFT = 13 52 | HTTOPRIGHT = 14 53 | HTBOTTOMLEFT = 16 54 | HTBOTTOMRIGHT = 17 55 | SPI_GETWORKAREA = 48 56 | WM_DESTROY = 2 57 | WKE_EXTENDED = 256 58 | WKE_REPEAT = 16384 59 | GWL_EXSTYLE = -20 60 | SRCCOPY = 13369376 61 | WM_TIMER = 275 62 | WM_ERASEBKGND = 20 63 | WM_SETCURSOR = 32 64 | OBJ_BITMAP = 7 65 | CAPTUREBLT = 1073741824 66 | GA_ROOT = 2 67 | WM_NCDESTROY = 130 68 | WM_CLOSE = 16 69 | CP_UTF8 = 65001 70 | CP_936 = 936 71 | CFS_POINT = 2 72 | CFS_FORCE_POSITION = 32 73 | ) 74 | 75 | var ( 76 | kr32 syscall.Handle 77 | dllGetCurrentThreadId uintptr 78 | 79 | u32 syscall.Handle 80 | dllPostQuitMessage uintptr 81 | dllDispatchMessage uintptr 82 | dllTranslateMessage uintptr 83 | dllPeekMessage uintptr 84 | 85 | mb syscall.Handle 86 | 87 | dllWkeCreateWebWindow uintptr 88 | dllWkeDestroyWebWindow uintptr 89 | dllWkeGetWindowHandle uintptr 90 | dllWkeShowWindow uintptr 91 | dllWkeEnableWindow uintptr 92 | dllWkeMoveWindow uintptr 93 | dllWkeMoveToCenter uintptr 94 | dllWkeResizeWindow uintptr 95 | dllWkeSetWindowTitleW uintptr 96 | dllWkeInitialize uintptr 97 | dllWkeIsInitialize uintptr 98 | dllWkeInitializeEx uintptr 99 | dllWkeFinalize uintptr 100 | dllWkeUpdate uintptr 101 | dllWkeGetVersion uintptr 102 | dllWkeGetVersionString uintptr 103 | dllWkeOnWindowClosing uintptr 104 | dllWkeOnWindowDestroy uintptr 105 | dllWkeSetNavigationToNewWindowEnable uintptr 106 | dllWkeLoadW uintptr 107 | dllWkeSetProxy uintptr 108 | dllWkeSetViewProxy uintptr 109 | dllWkeGetName uintptr 110 | dllWkeSetName uintptr 111 | dllWkeSetHandle uintptr 112 | dllWkeSetHandleOffset uintptr 113 | dllWkeSetUserAgentW uintptr 114 | dllWkeSetUserAgent uintptr 115 | dllWkeLoadURLW uintptr 116 | dllWkeLoadURL uintptr 117 | dllWkeLoadHTMLW uintptr 118 | dllWkeLoadHTML uintptr 119 | dllWkeLoadFileW uintptr 120 | dllWkePostURLW uintptr 121 | dllWkePostURL uintptr 122 | dllWkeGetURL uintptr 123 | dllWkeIsLoading uintptr 124 | dllWkeIsLoadingSucceeded uintptr 125 | dllWkeIsLoadingFailed uintptr 126 | dllWkeIsLoadingCompleted uintptr 127 | dllWkeIsDocumentReady uintptr 128 | dllWkeStopLoading uintptr 129 | dllWkeReload uintptr 130 | dllWkeGetTitleW uintptr 131 | dllWkeGetTitle uintptr 132 | dllWkeResize uintptr 133 | dllWkeGetWidth uintptr 134 | dllWkeGetHeight uintptr 135 | dllWkeGetContentWidth uintptr 136 | dllWkeGetContentHeight uintptr 137 | dllWkeRepaintIfNeeded uintptr 138 | dllWkeSetDirty uintptr 139 | dllWkeIsDirty uintptr 140 | dllWkeAddDirtyArea uintptr 141 | dllWkeLayoutIfNeeded uintptr 142 | dllWkePaint2 uintptr 143 | dllWkePaint uintptr 144 | dllWkeGetViewDC uintptr 145 | dllWkeGC uintptr 146 | dllWkeGetHostHWND uintptr 147 | dllWkeGetSource uintptr 148 | dllWkeCanGoBack uintptr 149 | dllWkeGoBack uintptr 150 | dllWkeCanGoForward uintptr 151 | dllWkeGoForward uintptr 152 | dllWkeEditorSelectAll uintptr 153 | dllWkeEditorUnSelect uintptr 154 | dllWkeEditorCopy uintptr 155 | dllWkeEditorCut uintptr 156 | dllWkeEditorPaste uintptr 157 | dllWkeEditorDelete uintptr 158 | dllWkeEditorUndo uintptr 159 | dllWkeEditorRedo uintptr 160 | dllWkeGetCookieW uintptr 161 | dllWkeGetCookie uintptr 162 | dllWkeSetCookie uintptr 163 | dllWkeSetCookieEnabled uintptr 164 | dllWkeIsCookieEnabled uintptr 165 | dllWkeSetCookieJarPath uintptr 166 | dllWkeSetCookieJarFullPath uintptr 167 | dllWkeSetMediaVolume uintptr 168 | dllWkeGetMediaVolume uintptr 169 | dllWkeSetFocus uintptr 170 | dllWkeKillFocus uintptr 171 | dllWkeRunJSW uintptr 172 | dllWkeRunJS uintptr 173 | dllWkeGlobalExec uintptr 174 | dllWkeSleep uintptr 175 | dllWkeWake uintptr 176 | dllWkeIsAwake uintptr 177 | dllWkeSetTransparent uintptr 178 | dllWkeSetZoomFactor uintptr 179 | dllWkeGetZoomFactor uintptr 180 | dllWkeSetEditable uintptr 181 | dllWkeGetStringW uintptr 182 | dllWkeGetString uintptr 183 | dllWkeSetStringW uintptr 184 | dllWkeGetWebViewForCurrentContext uintptr 185 | dllWkeSetUserKeyValue uintptr 186 | dllWkeGetUserKeyValue uintptr 187 | dllWkeSetDragFiles uintptr 188 | dllWkeOnTitleChanged uintptr 189 | dllWkeOnURLChanged uintptr 190 | dllWkeOnURLChanged2 uintptr 191 | dllWkeOnAlertBox uintptr 192 | dllWkeOnConfirmBox uintptr 193 | dllWkeOnPromptBox uintptr 194 | dllWkeOnNavigation uintptr 195 | dllWkeOnCreateView uintptr 196 | dllWkeOnDocumentReady uintptr 197 | dllWkeOnDocumentReady2 uintptr 198 | dllWkeOnLoadingFinish uintptr 199 | dllWkeOnDownload uintptr 200 | dllWkeOnConsole uintptr 201 | dllWkeOnPaintUpdated uintptr 202 | dllWkeOnWillMediaLoad uintptr 203 | dllWkeFireMouseEvent uintptr 204 | dllWkeFireContextMenuEvent uintptr 205 | dllWkeFireMouseWheelEvent uintptr 206 | dllWkeFireKeyUpEvent uintptr 207 | dllWkeFireKeyDownEvent uintptr 208 | dllWkeFireKeyPressEvent uintptr 209 | dllWkeFireWindowsMessage uintptr 210 | dllWkeIsMainFrame uintptr 211 | dllWkeIsWebRemoteFrame uintptr 212 | dllWkeWebFrameGetMainFrame uintptr 213 | dllWkeNetSetMIMEType uintptr 214 | dllWkeNetSetHTTPHeaderField uintptr 215 | dllWkeNetGetHTTPHeaderField uintptr 216 | dllWkeNetSetURL uintptr 217 | dllWkeNetSetData uintptr 218 | dllWkeGetCursorInfoType uintptr 219 | dllWkeSetCspCheckEnable uintptr 220 | dllWkeSetViewNetInterface uintptr 221 | dllWkeNetHookRequest uintptr 222 | dllWkeOnLoadUrlBegin uintptr 223 | dllWkeOnLoadUrlEnd uintptr 224 | dllWkeOnDidCreateScriptContext uintptr 225 | dllWkeOnWillReleaseScriptContext uintptr 226 | dllWkeNetOnResponse uintptr 227 | dllWkeNetGetMIMEType uintptr 228 | dllWkeWebFrameGetMainWorldScriptContext uintptr 229 | dllWkeGetBlinkMainThreadIsolate uintptr 230 | dllWkeCreateStringW uintptr 231 | dllWkeDeleteString uintptr 232 | dllWkeSetLocalStorageFullPath uintptr 233 | dllWkeJsBindFunction uintptr 234 | dllJsBindFunction uintptr 235 | dllWkeJsBindGetter uintptr 236 | dllJsBindGetter uintptr 237 | dllWkeJsBindSetter uintptr 238 | dllJsBindSetter uintptr 239 | dllJsArgCount uintptr 240 | dllJsArgType uintptr 241 | dllJsArg uintptr 242 | dllJsTypeOf uintptr 243 | dllJsIsNumber uintptr 244 | dllJsIsString uintptr 245 | dllJsIsBoolean uintptr 246 | dllJsIsObject uintptr 247 | dllJsIsFunction uintptr 248 | dllJsIsUndefined uintptr 249 | dllJsIsNull uintptr 250 | dllJsIsArray uintptr 251 | dllJsIsTrue uintptr 252 | dllJsIsFalse uintptr 253 | dllJsToInt uintptr 254 | dllJsToFloat uintptr 255 | dllJsToDouble uintptr 256 | dllJsToBoolean uintptr 257 | dllJsToTempStringW uintptr 258 | dllJsToTempString uintptr 259 | dllJsInt uintptr 260 | dllJsFloat uintptr 261 | dllJsDouble uintptr 262 | dllJsBoolean uintptr 263 | dllJsUndefined uintptr 264 | dllJsNull uintptr 265 | dllJsTrue uintptr 266 | dllJsFalse uintptr 267 | dllJsStringW uintptr 268 | dllJsEmptyObject uintptr 269 | dllJsEmptyArray uintptr 270 | dllJsObject uintptr 271 | dllJsFunction uintptr 272 | dllJsGetData uintptr 273 | dllJsGet uintptr 274 | dllJsSet uintptr 275 | dllJsGetAt uintptr 276 | dllJsSetAt uintptr 277 | dllJsGetLength uintptr 278 | dllJsSetLength uintptr 279 | dllJsGlobalObject uintptr 280 | dllJsGetWebView uintptr 281 | dllJsEvalW uintptr 282 | dllJsEvalExW uintptr 283 | dllJsCall uintptr 284 | dllJsCallGlobal uintptr 285 | dllJsGetGlobal uintptr 286 | dllJsSetGlobal uintptr 287 | dllJsGC uintptr 288 | dllJsToString uintptr 289 | dllJsToStringW uintptr 290 | dllJsArrayBuffer uintptr 291 | dllWkeSetFileSystem uintptr 292 | dllWkeCreateWebView uintptr 293 | dllWkeGetWebView uintptr 294 | dllWkeGetCaretRect uintptr 295 | dllWkeDestroyWebView uintptr 296 | dllWkeVisitAllCookie uintptr 297 | dllWkePerformCookieCommand uintptr 298 | dllWkeRunJsByFrame uintptr 299 | dllWkeSetNpapiPluginsEnabled uintptr 300 | dllWkeSetHeadlessEnabled uintptr 301 | dllWkeSetTouchEnabled uintptr 302 | dllWkeSetDragEnable uintptr 303 | dllWkeSetMemoryCacheEnable uintptr 304 | dllWkeOnMouseOverUrlChanged uintptr 305 | dllWkeSetDebugConfig uintptr 306 | dllWkeSetDeviceParameter uintptr 307 | dllWkeGetUserAgent uintptr 308 | dllWkeNetCancelRequest uintptr 309 | gonode syscall.Handle 310 | GOjsArg uintptr 311 | GOjsToString uintptr 312 | GOwkeRunJS uintptr 313 | GOjsIsTrue uintptr 314 | GOjsToInt uintptr 315 | GOjsToDouble uintptr 316 | GOBindNavigation uintptr 317 | GOBindCreateView uintptr 318 | GOBindLoadUrlBegin uintptr 319 | GOwkeSetNavigationToNewWindowEnable uintptr 320 | GOwkeCanGoBack uintptr 321 | GOwkeCanGoForward uintptr 322 | ) 323 | 324 | func loadMBDLL(mbPath, gonodePath string) { 325 | 326 | kr32, _ = syscall.LoadLibrary("kernel32.dll") 327 | dllGetCurrentThreadId, _ = syscall.GetProcAddress(kr32, "GetCurrentThreadId") 328 | 329 | u32, _ = syscall.LoadLibrary("user32.dll") 330 | dllPostQuitMessage, _ = syscall.GetProcAddress(u32, "PostQuitMessage") 331 | dllDispatchMessage, _ = syscall.GetProcAddress(u32, "DispatchMessageW") 332 | dllTranslateMessage, _ = syscall.GetProcAddress(u32, "TranslateMessage") 333 | dllPeekMessage, _ = syscall.GetProcAddress(u32, "PeekMessageW") 334 | 335 | mb, _ = syscall.LoadLibrary(mbPath) 336 | gonode, _ = syscall.LoadLibrary(gonodePath) 337 | 338 | GOjsArg, _ = syscall.GetProcAddress(gonode, "GOjsArg") 339 | GOjsToString, _ = syscall.GetProcAddress(gonode, "GOjsToString") 340 | GOwkeRunJS, _ = syscall.GetProcAddress(gonode, "GOwkeRunJS") 341 | GOjsIsTrue, _ = syscall.GetProcAddress(gonode, "GOjsIsTrue") 342 | GOjsToInt, _ = syscall.GetProcAddress(gonode, "GOjsToInt") 343 | GOjsToDouble, _ = syscall.GetProcAddress(gonode, "GOjsToDouble") 344 | GOBindNavigation, _ = syscall.GetProcAddress(gonode, "GOBindNavigation") 345 | GOBindCreateView, _ = syscall.GetProcAddress(gonode, "GOBindCreateView") 346 | GOBindLoadUrlBegin, _ = syscall.GetProcAddress(gonode, "GOBindLoadUrlBegin") 347 | GOwkeSetNavigationToNewWindowEnable, _ = syscall.GetProcAddress(gonode, "GOwkeSetNavigationToNewWindowEnable") 348 | GOwkeCanGoBack, _ = syscall.GetProcAddress(gonode, "GOwkeCanGoBack") 349 | GOwkeCanGoForward, _ = syscall.GetProcAddress(gonode, "GOwkeCanGoForward") 350 | 351 | dllWkeCreateWebWindow, _ = syscall.GetProcAddress(mb, "wkeCreateWebWindow") 352 | dllWkeDestroyWebWindow, _ = syscall.GetProcAddress(mb, "wkeDestroyWebWindow") 353 | dllWkeGetWindowHandle, _ = syscall.GetProcAddress(mb, "wkeGetWindowHandle") 354 | dllWkeShowWindow, _ = syscall.GetProcAddress(mb, "wkeShowWindow") 355 | dllWkeNetCancelRequest, _ = syscall.GetProcAddress(mb, "wkeNetCancelRequest") 356 | 357 | /* 358 | dllWkeEnableWindow, _ = syscall.GetProcAddress(mb, "wkeEnableWindow") 359 | dllWkeMoveWindow, _ = syscall.GetProcAddress(mb, "wkeMoveWindow")*/ 360 | dllWkeMoveToCenter, _ = syscall.GetProcAddress(mb, "wkeMoveToCenter") /* 361 | dllWkeResizeWindow, _ = syscall.GetProcAddress(mb, "wkeResizeWindow")*/ 362 | dllWkeSetWindowTitleW, _ = syscall.GetProcAddress(mb, "wkeSetWindowTitleW") 363 | dllWkeInitialize, _ = syscall.GetProcAddress(mb, "wkeInitialize") 364 | dllWkeIsInitialize, _ = syscall.GetProcAddress(mb, "wkeIsInitialize") /* 365 | dllWkeInitializeEx, _ = syscall.GetProcAddress(mb, "wkeInitializeEx")*/ 366 | dllWkeFinalize, _ = syscall.GetProcAddress(mb, "wkeFinalize") 367 | dllWkeGetUserAgent, _ = syscall.GetProcAddress(mb, "wkeGetUserAgent") /* 368 | dllWkeUpdate, _ = syscall.GetProcAddress(mb, "wkeUpdate") 369 | dllWkeGetVersion, _ = syscall.GetProcAddress(mb, "wkeGetVersion") 370 | dllWkeGetVersionString, _ = syscall.GetProcAddress(mb, "wkeGetVersionString") 371 | dllWkeOnWindowClosing, _ = syscall.GetProcAddress(mb, "wkeOnWindowClosing")*/ 372 | dllWkeOnWindowDestroy, _ = syscall.GetProcAddress(mb, "wkeOnWindowDestroy") /* 373 | dllWkeSetNavigationToNewWindowEnable, _ = syscall.GetProcAddress(mb, "wkeSetNavigationToNewWindowEnable") /* 374 | dllWkeLoadW, _ = syscall.GetProcAddress(mb, "wkeLoadW") 375 | dllWkeSetProxy, _ = syscall.GetProcAddress(mb, "wkeSetProxy") 376 | dllWkeSetViewProxy, _ = syscall.GetProcAddress(mb, "wkeSetViewProxy") 377 | dllWkeGetName, _ = syscall.GetProcAddress(mb, "wkeGetName") 378 | dllWkeSetName, _ = syscall.GetProcAddress(mb, "wkeSetName")*/ 379 | dllWkeSetHandle, _ = syscall.GetProcAddress(mb, "wkeSetHandle") /* 380 | dllWkeSetHandleOffset, _ = syscall.GetProcAddress(mb, "wkeSetHandleOffset") 381 | dllWkeSetUserAgentW, _ = syscall.GetProcAddress(mb, "wkeSetUserAgentW") 382 | dllWkeSetUserAgent, _ = syscall.GetProcAddress(mb, "wkeSetUserAgent")*/ 383 | dllWkeLoadURLW, _ = syscall.GetProcAddress(mb, "wkeLoadURLW") 384 | dllWkeLoadURL, _ = syscall.GetProcAddress(mb, "wkeLoadURL") /* 385 | dllWkeLoadHTMLW, _ = syscall.GetProcAddress(mb, "wkeLoadHTMLW")*/ 386 | dllWkeLoadHTML, _ = syscall.GetProcAddress(mb, "wkeLoadHTML") /* 387 | dllWkeLoadFileW, _ = syscall.GetProcAddress(mb, "wkeLoadFileW") 388 | dllWkePostURLW, _ = syscall.GetProcAddress(mb, "wkePostURLW") 389 | dllWkePostURL, _ = syscall.GetProcAddress(mb, "wkePostURL")*/ 390 | dllWkeGetURL, _ = syscall.GetProcAddress(mb, "wkeGetURL") /* 391 | dllWkeIsLoading, _ = syscall.GetProcAddress(mb, "wkeIsLoading") 392 | dllWkeIsLoadingSucceeded, _ = syscall.GetProcAddress(mb, "wkeIsLoadingSucceeded") 393 | dllWkeIsLoadingFailed, _ = syscall.GetProcAddress(mb, "wkeIsLoadingFailed") 394 | dllWkeIsLoadingCompleted, _ = syscall.GetProcAddress(mb, "wkeIsLoadingCompleted")*/ 395 | dllWkeIsDocumentReady, _ = syscall.GetProcAddress(mb, "wkeIsDocumentReady") /* 396 | dllWkeStopLoading, _ = syscall.GetProcAddress(mb, "wkeStopLoading")*/ 397 | dllWkeReload, _ = syscall.GetProcAddress(mb, "wkeReload") /* 398 | dllWkeGetTitleW, _ = syscall.GetProcAddress(mb, "wkeGetTitleW")*/ 399 | dllWkeGetTitle, _ = syscall.GetProcAddress(mb, "wkeGetTitle") 400 | dllWkeResize, _ = syscall.GetProcAddress(mb, "wkeResize") /* 401 | dllWkeGetWidth, _ = syscall.GetProcAddress(mb, "wkeGetWidth") 402 | dllWkeGetHeight, _ = syscall.GetProcAddress(mb, "wkeGetHeight") 403 | dllWkeGetContentWidth, _ = syscall.GetProcAddress(mb, "wkeGetContentWidth") 404 | dllWkeGetContentHeight, _ = syscall.GetProcAddress(mb, "wkeGetContentHeight") 405 | dllWkeRepaintIfNeeded, _ = syscall.GetProcAddress(mb, "wkeRepaintIfNeeded") 406 | dllWkeSetDirty, _ = syscall.GetProcAddress(mb, "wkeSetDirty") 407 | dllWkeIsDirty, _ = syscall.GetProcAddress(mb, "wkeIsDirty") 408 | dllWkeAddDirtyArea, _ = syscall.GetProcAddress(mb, "wkeAddDirtyArea") 409 | dllWkeLayoutIfNeeded, _ = syscall.GetProcAddress(mb, "wkeLayoutIfNeeded") 410 | dllWkePaint2, _ = syscall.GetProcAddress(mb, "wkePaint2") 411 | dllWkePaint, _ = syscall.GetProcAddress(mb, "wkePaint")*/ 412 | dllWkeGetViewDC, _ = syscall.GetProcAddress(mb, "wkeGetViewDC") /* 413 | dllWkeGC, _ = syscall.GetProcAddress(mb, "wkeGC") 414 | dllWkeGetHostHWND, _ = syscall.GetProcAddress(mb, "wkeGetHostHWND") 415 | dllWkeGetSource, _ = syscall.GetProcAddress(mb, "wkeGetSource") 416 | dllWkeCanGoBack, _ = syscall.GetProcAddress(mb, "wkeCanGoBack") 417 | dllWkeCanGoForward, _ = syscall.GetProcAddress(mb, "wkeCanGoForward")*/ 418 | dllWkeGoBack, _ = syscall.GetProcAddress(mb, "wkeGoBack") 419 | dllWkeGoForward, _ = syscall.GetProcAddress(mb, "wkeGoForward") /* 420 | dllWkeEditorSelectAll, _ = syscall.GetProcAddress(mb, "wkeEditorSelectAll") 421 | dllWkeEditorUnSelect, _ = syscall.GetProcAddress(mb, "wkeEditorUnSelect") 422 | dllWkeEditorCopy, _ = syscall.GetProcAddress(mb, "wkeEditorCopy") 423 | dllWkeEditorCut, _ = syscall.GetProcAddress(mb, "wkeEditorCut") 424 | dllWkeEditorPaste, _ = syscall.GetProcAddress(mb, "wkeEditorPaste") 425 | dllWkeEditorDelete, _ = syscall.GetProcAddress(mb, "wkeEditorDelete") 426 | dllWkeEditorUndo, _ = syscall.GetProcAddress(mb, "wkeEditorUndo") 427 | dllWkeEditorRedo, _ = syscall.GetProcAddress(mb, "wkeEditorRedo") 428 | dllWkeGetCookieW, _ = syscall.GetProcAddress(mb, "wkeGetCookieW")*/ 429 | dllWkeGetCookie, _ = syscall.GetProcAddress(mb, "wkeGetCookie") /* 430 | dllWkeSetCookie, _ = syscall.GetProcAddress(mb, "wkeSetCookie") 431 | dllWkeSetCookieEnabled, _ = syscall.GetProcAddress(mb, "wkeSetCookieEnabled") 432 | dllWkeIsCookieEnabled, _ = syscall.GetProcAddress(mb, "wkeIsCookieEnabled") 433 | dllWkeSetCookieJarPath, _ = syscall.GetProcAddress(mb, "wkeSetCookieJarPath") 434 | dllWkeSetCookieJarFullPath, _ = syscall.GetProcAddress(mb, "wkeSetCookieJarFullPath") 435 | dllWkeSetMediaVolume, _ = syscall.GetProcAddress(mb, "wkeSetMediaVolume") 436 | dllWkeGetMediaVolume, _ = syscall.GetProcAddress(mb, "wkeGetMediaVolume")*/ 437 | dllWkeSetFocus, _ = syscall.GetProcAddress(mb, "wkeSetFocus") 438 | dllWkeKillFocus, _ = syscall.GetProcAddress(mb, "wkeKillFocus") /* 439 | dllWkeRunJSW, _ = syscall.GetProcAddress(mb, "wkeRunJSW")*/ 440 | dllWkeRunJS, _ = syscall.GetProcAddress(mb, "wkeRunJS") 441 | dllWkeGlobalExec, _ = syscall.GetProcAddress(mb, "wkeGlobalExec") /* 442 | dllWkeSleep, _ = syscall.GetProcAddress(mb, "wkeSleep") 443 | dllWkeWake, _ = syscall.GetProcAddress(mb, "wkeWake") 444 | dllWkeIsAwake, _ = syscall.GetProcAddress(mb, "wkeIsAwake") 445 | dllWkeSetTransparent, _ = syscall.GetProcAddress(mb, "wkeSetTransparent") 446 | dllWkeSetZoomFactor, _ = syscall.GetProcAddress(mb, "wkeSetZoomFactor") 447 | dllWkeGetZoomFactor, _ = syscall.GetProcAddress(mb, "wkeGetZoomFactor") 448 | dllWkeSetEditable, _ = syscall.GetProcAddress(mb, "wkeSetEditable") 449 | dllWkeGetStringW, _ = syscall.GetProcAddress(mb, "wkeGetStringW")*/ 450 | dllWkeGetString, _ = syscall.GetProcAddress(mb, "wkeGetString") /* 451 | dllWkeSetStringW, _ = syscall.GetProcAddress(mb, "wkeSetStringW") 452 | dllWkeGetWebViewForCurrentContext, _ = syscall.GetProcAddress(mb, "wkeGetWebViewForCurrentContext") 453 | dllWkeSetUserKeyValue, _ = syscall.GetProcAddress(mb, "wkeSetUserKeyValue") 454 | dllWkeGetUserKeyValue, _ = syscall.GetProcAddress(mb, "wkeGetUserKeyValue") 455 | dllWkeSetDragFiles, _ = syscall.GetProcAddress(mb, "wkeSetDragFiles")*/ 456 | dllWkeOnTitleChanged, _ = syscall.GetProcAddress(mb, "wkeOnTitleChanged") 457 | dllWkeOnURLChanged, _ = syscall.GetProcAddress(mb, "wkeOnURLChanged") 458 | dllWkeOnURLChanged2, _ = syscall.GetProcAddress(mb, "wkeOnURLChanged2") 459 | dllWkeOnAlertBox, _ = syscall.GetProcAddress(mb, "wkeOnAlertBox") /* 460 | dllWkeOnConfirmBox, _ = syscall.GetProcAddress(mb, "wkeOnConfirmBox") 461 | dllWkeOnPromptBox, _ = syscall.GetProcAddress(mb, "wkeOnPromptBox") 462 | dllWkeOnNavigation, _ = syscall.GetProcAddress(mb, "wkeOnNavigation")*/ 463 | dllWkeOnCreateView, _ = syscall.GetProcAddress(mb, "wkeOnCreateView") 464 | dllWkeOnDocumentReady, _ = syscall.GetProcAddress(mb, "wkeOnDocumentReady") 465 | dllWkeOnDocumentReady2, _ = syscall.GetProcAddress(mb, "wkeOnDocumentReady2") /* 466 | dllWkeOnLoadingFinish, _ = syscall.GetProcAddress(mb, "wkeOnLoadingFinish") 467 | dllWkeOnDownload, _ = syscall.GetProcAddress(mb, "wkeOnDownload") 468 | dllWkeOnConsole, _ = syscall.GetProcAddress(mb, "wkeOnConsole") 469 | dllWkeOnPaintUpdated, _ = syscall.GetProcAddress(mb, "wkeOnPaintUpdated") 470 | dllWkeOnWillMediaLoad, _ = syscall.GetProcAddress(mb, "wkeOnWillMediaLoad") 471 | dllWkeFireMouseEvent, _ = syscall.GetProcAddress(mb, "wkeFireMouseEvent") 472 | dllWkeFireContextMenuEvent, _ = syscall.GetProcAddress(mb, "wkeFireContextMenuEvent") 473 | dllWkeFireMouseWheelEvent, _ = syscall.GetProcAddress(mb, "wkeFireMouseWheelEvent") 474 | dllWkeFireKeyUpEvent, _ = syscall.GetProcAddress(mb, "wkeFireKeyUpEvent") 475 | dllWkeFireKeyDownEvent, _ = syscall.GetProcAddress(mb, "wkeFireKeyDownEvent") 476 | dllWkeFireKeyPressEvent, _ = syscall.GetProcAddress(mb, "wkeFireKeyPressEvent") 477 | dllWkeFireWindowsMessage, _ = syscall.GetProcAddress(mb, "wkeFireWindowsMessage") 478 | dllWkeIsMainFrame, _ = syscall.GetProcAddress(mb, "wkeIsMainFrame") 479 | dllWkeIsWebRemoteFrame, _ = syscall.GetProcAddress(mb, "wkeIsWebRemoteFrame") 480 | dllWkeWebFrameGetMainFrame, _ = syscall.GetProcAddress(mb, "wkeWebFrameGetMainFrame") 481 | dllWkeNetSetMIMEType, _ = syscall.GetProcAddress(mb, "wkeNetSetMIMEType") 482 | dllWkeNetSetHTTPHeaderField, _ = syscall.GetProcAddress(mb, "wkeNetSetHTTPHeaderField") 483 | dllWkeNetGetHTTPHeaderField, _ = syscall.GetProcAddress(mb, "wkeNetGetHTTPHeaderField") 484 | dllWkeNetSetURL, _ = syscall.GetProcAddress(mb, "wkeNetSetURL") 485 | dllWkeNetSetData, _ = syscall.GetProcAddress(mb, "wkeNetSetData") 486 | dllWkeGetCursorInfoType, _ = syscall.GetProcAddress(mb, "wkeGetCursorInfoType") 487 | dllWkeSetCspCheckEnable, _ = syscall.GetProcAddress(mb, "wkeSetCspCheckEnable") 488 | dllWkeSetViewNetInterface, _ = syscall.GetProcAddress(mb, "wkeSetViewNetInterface")*/ 489 | dllWkeNetHookRequest, _ = syscall.GetProcAddress(mb, "wkeNetHookRequest") 490 | dllWkeOnLoadUrlBegin, _ = syscall.GetProcAddress(mb, "wkeOnLoadUrlBegin") 491 | dllWkeOnLoadUrlEnd, _ = syscall.GetProcAddress(mb, "wkeOnLoadUrlEnd") /* 492 | dllWkeOnDidCreateScriptContext, _ = syscall.GetProcAddress(mb, "wkeOnDidCreateScriptContext") 493 | dllWkeOnWillReleaseScriptContext, _ = syscall.GetProcAddress(mb, "wkeOnWillReleaseScriptContext") 494 | dllWkeNetOnResponse, _ = syscall.GetProcAddress(mb, "wkeNetOnResponse") 495 | dllWkeNetGetMIMEType, _ = syscall.GetProcAddress(mb, "wkeNetGetMIMEType") 496 | dllWkeWebFrameGetMainWorldScriptContext, _ = syscall.GetProcAddress(mb, "wkeWebFrameGetMainWorldScriptContext") 497 | dllWkeGetBlinkMainThreadIsolate, _ = syscall.GetProcAddress(mb, "wkeGetBlinkMainThreadIsolate") 498 | dllWkeCreateStringW, _ = syscall.GetProcAddress(mb, "wkeCreateStringW") 499 | dllWkeDeleteString, _ = syscall.GetProcAddress(mb, "wkeDeleteString") 500 | dllWkeSetLocalStorageFullPath, _ = syscall.GetProcAddress(mb, "wkeSetLocalStorageFullPath")*/ 501 | dllWkeJsBindFunction, _ = syscall.GetProcAddress(mb, "wkeJsBindFunction") /* 502 | dllJsBindFunction, _ = syscall.GetProcAddress(mb, "jsBindFunction") 503 | dllWkeJsBindGetter, _ = syscall.GetProcAddress(mb, "wkeJsBindGetter") 504 | dllJsBindGetter, _ = syscall.GetProcAddress(mb, "jsBindGetter") 505 | dllWkeJsBindSetter, _ = syscall.GetProcAddress(mb, "wkeJsBindSetter") 506 | dllJsBindSetter, _ = syscall.GetProcAddress(mb, "jsBindSetter") 507 | dllJsArgCount, _ = syscall.GetProcAddress(mb, "jsArgCount") 508 | dllJsArgType, _ = syscall.GetProcAddress(mb, "jsArgType")*/ 509 | dllJsArg, _ = syscall.GetProcAddress(mb, "jsArg") /* 510 | dllJsTypeOf, _ = syscall.GetProcAddress(mb, "jsTypeOf") 511 | dllJsIsNumber, _ = syscall.GetProcAddress(mb, "jsIsNumber") 512 | dllJsIsString, _ = syscall.GetProcAddress(mb, "jsIsString") 513 | dllJsIsBoolean, _ = syscall.GetProcAddress(mb, "jsIsBoolean") 514 | dllJsIsObject, _ = syscall.GetProcAddress(mb, "jsIsObject") 515 | dllJsIsFunction, _ = syscall.GetProcAddress(mb, "jsIsFunction") 516 | dllJsIsUndefined, _ = syscall.GetProcAddress(mb, "jsIsUndefined") 517 | dllJsIsNull, _ = syscall.GetProcAddress(mb, "jsIsNull") 518 | dllJsIsArray, _ = syscall.GetProcAddress(mb, "jsIsArray")*/ 519 | dllJsIsTrue, _ = syscall.GetProcAddress(mb, "jsIsTrue") 520 | dllJsIsFalse, _ = syscall.GetProcAddress(mb, "jsIsFalse") 521 | dllJsToInt, _ = syscall.GetProcAddress(mb, "jsToInt") 522 | dllJsToFloat, _ = syscall.GetProcAddress(mb, "jsToFloat") 523 | dllJsToDouble, _ = syscall.GetProcAddress(mb, "jsToDouble") /* 524 | dllJsToBoolean, _ = syscall.GetProcAddress(mb, "jsToBoolean")*/ 525 | dllJsToTempString, _ = syscall.GetProcAddress(mb, "jsToTempString") /* 526 | dllJsInt, _ = syscall.GetProcAddress(mb, "jsInt") 527 | dllJsFloat, _ = syscall.GetProcAddress(mb, "jsFloat") 528 | dllJsDouble, _ = syscall.GetProcAddress(mb, "jsDouble") 529 | dllJsBoolean, _ = syscall.GetProcAddress(mb, "jsBoolean") 530 | dllJsUndefined, _ = syscall.GetProcAddress(mb, "jsUndefined") 531 | dllJsNull, _ = syscall.GetProcAddress(mb, "jsNull") 532 | dllJsTrue, _ = syscall.GetProcAddress(mb, "jsTrue") 533 | dllJsFalse, _ = syscall.GetProcAddress(mb, "jsFalse") 534 | dllJsStringW, _ = syscall.GetProcAddress(mb, "jsStringW") 535 | dllJsEmptyObject, _ = syscall.GetProcAddress(mb, "jsEmptyObject") 536 | dllJsEmptyArray, _ = syscall.GetProcAddress(mb, "jsEmptyArray") 537 | dllJsObject, _ = syscall.GetProcAddress(mb, "jsObject") 538 | dllJsFunction, _ = syscall.GetProcAddress(mb, "jsFunction") 539 | dllJsGetData, _ = syscall.GetProcAddress(mb, "jsGetData") 540 | dllJsGet, _ = syscall.GetProcAddress(mb, "jsGet") 541 | dllJsSet, _ = syscall.GetProcAddress(mb, "jsSet") 542 | dllJsGetAt, _ = syscall.GetProcAddress(mb, "jsGetAt") 543 | dllJsSetAt, _ = syscall.GetProcAddress(mb, "jsSetAt") 544 | dllJsGetLength, _ = syscall.GetProcAddress(mb, "jsGetLength") 545 | dllJsSetLength, _ = syscall.GetProcAddress(mb, "jsSetLength") 546 | dllJsGlobalObject, _ = syscall.GetProcAddress(mb, "jsGlobalObject") 547 | dllJsGetWebView, _ = syscall.GetProcAddress(mb, "jsGetWebView") 548 | dllJsEvalW, _ = syscall.GetProcAddress(mb, "jsEvalW") 549 | dllJsEvalExW, _ = syscall.GetProcAddress(mb, "jsEvalExW") 550 | dllJsCall, _ = syscall.GetProcAddress(mb, "jsCall") 551 | dllJsCallGlobal, _ = syscall.GetProcAddress(mb, "jsCallGlobal") 552 | dllJsGetGlobal, _ = syscall.GetProcAddress(mb, "jsGetGlobal") 553 | dllJsSetGlobal, _ = syscall.GetProcAddress(mb, "jsSetGlobal") 554 | dllJsGC, _ = syscall.GetProcAddress(mb, "jsGC")*/ 555 | dllJsToString, _ = syscall.GetProcAddress(mb, "jsToString") 556 | dllJsToStringW, _ = syscall.GetProcAddress(mb, "jsToStringW") /* 557 | dllJsArrayBuffer, _ = syscall.GetProcAddress(mb, "jsArrayBuffer") 558 | dllWkeSetFileSystem, _ = syscall.GetProcAddress(mb, "wkeSetFileSystem")*/ 559 | dllWkeCreateWebView, _ = syscall.GetProcAddress(mb, "wkeCreateWebView") 560 | dllWkeGetWebView, _ = syscall.GetProcAddress(mb, "wkeGetWebView") 561 | dllWkeGetCaretRect, _ = syscall.GetProcAddress(mb, "wkeGetCaretRect") /* 562 | dllWkeDestroyWebView, _ = syscall.GetProcAddress(mb, "wkeDestroyWebView") 563 | dllWkeVisitAllCookie, _ = syscall.GetProcAddress(mb, "wkeVisitAllCookie") 564 | dllWkePerformCookieCommand, _ = syscall.GetProcAddress(mb, "wkePerformCookieCommand") 565 | dllWkeRunJsByFrame, _ = syscall.GetProcAddress(mb, "wkeRunJsByFrame") 566 | dllWkeSetNpapiPluginsEnabled, _ = syscall.GetProcAddress(mb, "wkeSetNpapiPluginsEnabled") 567 | dllWkeSetHeadlessEnabled, _ = syscall.GetProcAddress(mb, "wkeSetHeadlessEnabled") 568 | dllWkeSetTouchEnabled, _ = syscall.GetProcAddress(mb, "wkeSetTouchEnabled") 569 | dllWkeSetDragEnable, _ = syscall.GetProcAddress(mb, "wkeSetDragEnable") 570 | dllWkeSetMemoryCacheEnable, _ = syscall.GetProcAddress(mb, "wkeSetMemoryCacheEnable") 571 | dllWkeOnMouseOverUrlChanged, _ = syscall.GetProcAddress(mb, "wkeOnMouseOverUrlChanged") 572 | dllWkeSetDebugConfig, _ = syscall.GetProcAddress(mb, "wkeSetDebugConfig") 573 | dllWkeSetDeviceParameter, _ = syscall.GetProcAddress(mb, "wkeSetDeviceParameter")*/ 574 | 575 | } 576 | 577 | func freeMBDLL() { 578 | syscall.FreeLibrary(mb) 579 | syscall.FreeLibrary(gonode) 580 | syscall.FreeLibrary(kr32) 581 | syscall.FreeLibrary(u32) 582 | } 583 | -------------------------------------------------------------------------------- /miniblinkCommand.go: -------------------------------------------------------------------------------- 1 | package gowebui 2 | 3 | import ( 4 | "syscall" 5 | "unicode/utf16" 6 | "unsafe" 7 | ) 8 | 9 | type point struct { 10 | X, Y int32 11 | } 12 | type msg struct { 13 | HWnd uintptr 14 | Message uint32 15 | WParam uintptr 16 | LParam uintptr 17 | Time uint32 18 | Pt point 19 | } 20 | 21 | func getCurrentThreadId() uint32 { 22 | ret, _, _ := syscall.Syscall(dllGetCurrentThreadId, 0, 23 | 0, 24 | 0, 25 | 0) 26 | 27 | return uint32(ret) 28 | } 29 | 30 | func postQuitMessage(exitCode int32) { 31 | syscall.Syscall(dllPostQuitMessage, 1, 32 | uintptr(exitCode), 33 | 0, 34 | 0) 35 | } 36 | 37 | func peekMessage(lpMsg *msg, hWnd uintptr, wMsgFilterMin, wMsgFilterMax, wRemoveMsg uint32) bool { 38 | ret, _, _ := syscall.Syscall6(dllPeekMessage, 5, 39 | uintptr(unsafe.Pointer(lpMsg)), 40 | uintptr(hWnd), 41 | uintptr(wMsgFilterMin), 42 | uintptr(wMsgFilterMax), 43 | uintptr(wRemoveMsg), 44 | 0) 45 | 46 | return ret != 0 47 | } 48 | 49 | func translateMessage(msg *msg) bool { 50 | ret, _, _ := syscall.Syscall(dllTranslateMessage, 1, 51 | uintptr(unsafe.Pointer(msg)), 52 | 0, 53 | 0) 54 | 55 | return ret != 0 56 | } 57 | 58 | func dispatchMessage(msg *msg) uintptr { 59 | ret, _, _ := syscall.Syscall(dllDispatchMessage, 1, 60 | uintptr(unsafe.Pointer(msg)), 61 | 0, 62 | 0) 63 | 64 | return ret 65 | } 66 | 67 | func miniblinkCommand(m_WebView WkeWebView, command string, args ...interface{}) interface{} { 68 | var ret uintptr 69 | switch command { 70 | case "wkeIsInitialize": 71 | ret, _, _ = syscall.Syscall(dllWkeIsInitialize, 0, 0, 0, 0) 72 | if ptrToInt32(ret) == 1 { 73 | return true 74 | } else { 75 | return false 76 | } 77 | case "wkeInitialize": 78 | ret, _, _ = syscall.Syscall(dllWkeInitialize, 0, 0, 0, 0) 79 | case "wkeDestroyWebWindow": 80 | ret, _, _ = syscall.Syscall(dllWkeDestroyWebWindow, 1, wkeWebViewToPtr(m_WebView), 0, 0) 81 | case "wkeLoadURL": 82 | ret, _, _ = syscall.Syscall(dllWkeLoadURL, 2, wkeWebViewToPtr(m_WebView), strToPtr(args[0].(string)), 0) 83 | case "wkeShowWindow": 84 | ret, _, _ = syscall.Syscall(dllWkeShowWindow, 2, wkeWebViewToPtr(m_WebView), args[0].(uintptr), 0) 85 | case "wkeMoveToCenter": 86 | ret, _, _ = syscall.Syscall(dllWkeMoveToCenter, 1, wkeWebViewToPtr(m_WebView), 0, 0) 87 | case "wkeGetURL": 88 | ret, _, _ = syscall.Syscall(dllWkeGetURL, 1, wkeWebViewToPtr(m_WebView), 0, 0) 89 | return PtrToString(ret) 90 | case "wkeGetTitle": 91 | ret, _, _ = syscall.Syscall(dllWkeGetTitle, 1, wkeWebViewToPtr(m_WebView), 0, 0) 92 | return PtrToString(ret) 93 | case "wkeCreateWebWindow": 94 | ret, _, _ = syscall.Syscall6(dllWkeCreateWebWindow, 6, int32ToPtr(args[0].(int32)), int32ToPtr(args[1].(int32)), int32ToPtr(args[2].(int32)), int32ToPtr(args[3].(int32)), int32ToPtr(args[4].(int32)), int32ToPtr(args[5].(int32))) 95 | return WkeWebView(ptrToInt32(ret)) 96 | case "wkeGetWindowHandle": 97 | ret, _, _ = syscall.Syscall(dllWkeGetWindowHandle, 1, wkeWebViewToPtr(m_WebView), 0, 0) 98 | return HWnd(ptrToInt32(ret)) 99 | case "wkeSetWindowTitle": 100 | ret, _, _ = syscall.Syscall(dllWkeSetWindowTitleW, 2, wkeWebViewToPtr(m_WebView), strToUTF16Ptr(args[0].(string)), 0) 101 | case "wkeLoadHTML": 102 | ret, _, _ = syscall.Syscall(dllWkeLoadHTML, 2, wkeWebViewToPtr(m_WebView), strToPtr(args[0].(string)), 0) 103 | case "jsArg": 104 | ret, _, _ = syscall.Syscall(GOjsArg, 2, jsExecStateToPtr(args[0].(JsExecState)), int32ToPtr(args[1].(int32)), 0) 105 | return JsValue(PtrToString(ret)) 106 | case "jsToString": 107 | ret, _, _ = syscall.Syscall(GOjsToString, 2, jsExecStateToPtr(args[0].(JsExecState)), jsValueToPtr(args[1].(JsValue)), 0) 108 | return PtrToString(ret) 109 | case "wkeGlobalExec": 110 | ret, _, _ = syscall.Syscall(dllWkeGlobalExec, 1, wkeWebViewToPtr(m_WebView), 0, 0) 111 | return JsExecState(ptrToUint32(&ret)) 112 | case "wkeRunJS": 113 | ret, _, _ = syscall.Syscall(GOwkeRunJS, 2, wkeWebViewToPtr(m_WebView), strToPtr(args[0].(string)), 0) 114 | return ptrToJsValue(ret) 115 | case "jsToInt": 116 | ret, _, _ = syscall.Syscall(GOjsToInt, 2, jsExecStateToPtr(args[0].(JsExecState)), jsValueToPtr(args[1].(JsValue)), 0) 117 | return ptrToInt32(ret) 118 | case "jsToDouble": 119 | ret, _, _ = syscall.Syscall(GOjsToDouble, 2, jsExecStateToPtr(args[0].(JsExecState)), jsValueToPtr(args[1].(JsValue)), 0) 120 | return ptrToFloat64(ret) 121 | case "jsIsTrue": 122 | ret, _, _ = syscall.Syscall(GOjsIsTrue, 1, jsValueToPtr(args[0].(JsValue)), 0, 0) 123 | if ptrToInt32(ret) == 1 { 124 | return true 125 | } else { 126 | return false 127 | } 128 | case "wkeIsDocumentReady": 129 | ret, _, _ = syscall.Syscall(dllWkeIsDocumentReady, 1, wkeWebViewToPtr(m_WebView), 0, 0) 130 | if ptrToInt32(ret) == 1 { 131 | return true 132 | } else { 133 | return false 134 | } 135 | case "wkeGetCookie": 136 | ret, _, _ = syscall.Syscall(dllWkeGetCookie, 1, wkeWebViewToPtr(m_WebView), 0, 0) 137 | return PtrToString(ret) 138 | 139 | case "wkeResize": 140 | ret, _, _ = syscall.Syscall(dllWkeResize, 3, wkeWebViewToPtr(m_WebView), args[0].(uintptr), args[1].(uintptr)) 141 | return ret 142 | 143 | case "wkeGetUserAgent": 144 | ret, _, _ = syscall.Syscall(dllWkeGetUserAgent, 1, wkeWebViewToPtr(m_WebView), 0, 0) 145 | return PtrToString(ret) 146 | case "wkeGetString": 147 | ret, _, _ = syscall.Syscall(dllWkeGetString, 1, wkeStringToPtr(args[0].(WkeString)), 0, 0) 148 | return PtrToString(ret) 149 | case "wkeNetHookRequest": 150 | ret, _, _ = syscall.Syscall(dllWkeNetHookRequest, 1, args[0].(uintptr), 0, 0) 151 | return 0 152 | case "wkeNetCancelRequest": 153 | ret, _, _ = syscall.Syscall(dllWkeNetCancelRequest, 1, args[0].(uintptr), 0, 0) 154 | return 0 155 | case "wkeSetNavigationToNewWindowEnable": 156 | ret, _, _ = syscall.Syscall(GOwkeSetNavigationToNewWindowEnable, 2, wkeWebViewToPtr(m_WebView), args[0].(uintptr), 0) 157 | return 0 158 | case "wkeCanGoBack": 159 | ret, _, _ = syscall.Syscall(GOwkeCanGoBack, 1, wkeWebViewToPtr(m_WebView), 0, 0) 160 | if ptrToInt32(ret) == 1 { 161 | return true 162 | } else { 163 | return false 164 | } 165 | case "wkeGoBack": 166 | ret, _, _ = syscall.Syscall(dllWkeGoBack, 1, wkeWebViewToPtr(m_WebView), 0, 0) 167 | return 0 168 | case "wkeCanGoForward": 169 | ret, _, _ = syscall.Syscall(GOwkeCanGoForward, 1, wkeWebViewToPtr(m_WebView), 0, 0) 170 | if ptrToInt32(ret) == 1 { 171 | return true 172 | } else { 173 | return false 174 | } 175 | case "wkeGoForward": 176 | ret, _, _ = syscall.Syscall(dllWkeGoForward, 1, wkeWebViewToPtr(m_WebView), 0, 0) 177 | return 0 178 | case "wkeReload": 179 | ret, _, _ = syscall.Syscall(dllWkeReload, 1, wkeWebViewToPtr(m_WebView), 0, 0) 180 | return 0 181 | default: 182 | } 183 | return ret 184 | } 185 | 186 | //以下为类型转换 187 | func strToPtr(s string) uintptr { 188 | url := []byte(s) 189 | url = append(url, byte(0)) 190 | return uintptr(unsafe.Pointer(&url[0])) 191 | } 192 | func strToUTF16Ptr(s string) uintptr { 193 | return uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(s))) 194 | } 195 | 196 | func PtrToString(ptr uintptr) string { 197 | p := (*byte)(unsafe.Pointer(ptr)) 198 | data := make([]byte, 0) 199 | for *p != 0 { 200 | data = append(data, *p) 201 | ptr += unsafe.Sizeof(byte(0)) 202 | p = (*byte)(unsafe.Pointer(ptr)) 203 | } 204 | return string(data) 205 | } 206 | 207 | func utf16ptrToString(po *uintptr) string { 208 | p := (*uint16)(unsafe.Pointer(po)) 209 | ptr := *po 210 | data := make([]uint16, 0) 211 | for *p != 0 { 212 | data = append(data, *p) 213 | ptr += unsafe.Sizeof(uint16(0)) 214 | p = (*uint16)(unsafe.Pointer(ptr)) 215 | } 216 | return string(utf16.Decode(data)) 217 | } 218 | 219 | func ptrToUint32(p *uintptr) uint32 { 220 | return *(*uint32)(unsafe.Pointer(p)) 221 | } 222 | 223 | func ptrToInt32(p uintptr) int32 { 224 | return int32(p) 225 | } 226 | 227 | func ptrToFloat64(p uintptr) float64 { 228 | return *(*float64)(unsafe.Pointer(p)) 229 | } 230 | 231 | func int32ToPtr(i int32) uintptr { 232 | return uintptr(i) 233 | } 234 | 235 | func wkeStringToPtr(s WkeString) uintptr { 236 | return uintptr(s) 237 | } 238 | 239 | func int64ToPtr(i int64) uintptr { 240 | return uintptr(unsafe.Pointer(&i)) 241 | } 242 | 243 | func ptrToInt64(p *uintptr) int64 { 244 | return int64(*(*uint64)(unsafe.Pointer(p))) 245 | } 246 | 247 | func ptrToInt641(p uintptr) int64 { 248 | return int64(*(*uint64)(unsafe.Pointer(&p))) 249 | } 250 | 251 | func jsExecStateToPtr(es JsExecState) uintptr { 252 | return uintptr(es) 253 | } 254 | 255 | func wkeWebViewToPtr(w WkeWebView) uintptr { 256 | return uintptr(w) 257 | } 258 | 259 | func jsValueToPtr(v JsValue) uintptr { 260 | url := []byte(v) 261 | url = append(url, byte(0)) 262 | return uintptr(unsafe.Pointer(&url[0])) 263 | } 264 | 265 | func ptrToJsValue(ptr uintptr) JsValue { 266 | p := (*byte)(unsafe.Pointer(ptr)) 267 | data := make([]byte, 0) 268 | for *p != 0 { 269 | data = append(data, *p) 270 | ptr += unsafe.Sizeof(byte(0)) 271 | p = (*byte)(unsafe.Pointer(ptr)) 272 | } 273 | return JsValue(string(data)) 274 | } 275 | 276 | func hWndToPtr(h HWnd) uintptr { 277 | return uintptr(h) 278 | } 279 | --------------------------------------------------------------------------------