├── README.md └── main.go /README.md: -------------------------------------------------------------------------------- 1 | ## 不基于cgo来调用miniblink例子 -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | // miniblink project main.go 2 | package main 3 | 4 | import ( 5 | "fmt" 6 | _ "time" 7 | 8 | "syscall" 9 | "unsafe" 10 | 11 | "github.com/jthmath/winapi" 12 | ) 13 | 14 | type wkeWindowType int32 15 | 16 | //任务队列,保证所有的API调用都在痛一个线程 17 | var jobQueue = make(chan func()) 18 | 19 | const ( 20 | WKE_WINDOW_TYPE_POPUP wkeWindowType = iota 21 | WKE_WINDOW_TYPE_TRANSPARENT 22 | WKE_WINDOW_TYPE_CONTROL 23 | ) 24 | 25 | type miniblink struct { 26 | mbHandle syscall.Handle 27 | wkeWebView uintptr 28 | } 29 | 30 | func IntPtr(n int) uintptr { 31 | return uintptr(n) 32 | } 33 | 34 | var itob = func(i int) bool { 35 | if i == 0 { 36 | return false 37 | } 38 | return true 39 | } 40 | 41 | var btoi = func(b bool) int { 42 | if b { 43 | return 1 44 | } 45 | return 0 46 | } 47 | 48 | func StrPtr(s string) uintptr { 49 | return uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(s))) 50 | } 51 | func NewMb() *miniblink { 52 | mb, _ := syscall.LoadLibrary("node.dll") 53 | return &miniblink{mbHandle: mb} 54 | } 55 | func (mb *miniblink) FreeMb() { 56 | syscall.FreeLibrary(mb.mbHandle) 57 | } 58 | func (mb *miniblink) wkeVersion() int { 59 | wkeVersion, _ := syscall.GetProcAddress(mb.mbHandle, "wkeVersion") 60 | ret, _, _ := syscall.Syscall(wkeVersion, 0, 0, 0, 0) 61 | return int(ret) 62 | } 63 | func (mb *miniblink) wkeInitialize() { 64 | HWND, _ := syscall.GetProcAddress(mb.mbHandle, "wkeInitialize") 65 | syscall.Syscall(HWND, 0, 0, 0, 0) 66 | } 67 | func (mb *miniblink) wkeCreateWebWindow(Type uintptr, parent int, x int, y int, width int, height int) uintptr { 68 | HWND, _ := syscall.GetProcAddress(mb.mbHandle, "wkeCreateWebWindow") 69 | ret, _, _ := syscall.Syscall6(HWND, 6, Type, IntPtr(parent), IntPtr(x), IntPtr(y), IntPtr(width), IntPtr(height)) 70 | mb.wkeWebView = ret 71 | return ret 72 | } 73 | func (mb *miniblink) wkeShowWindow(showFlag bool) { 74 | HWND, _ := syscall.GetProcAddress(mb.mbHandle, "wkeShowWindow") 75 | syscall.Syscall(HWND, 2, mb.wkeWebView, IntPtr(1), 0) 76 | } 77 | func (mb *miniblink) wkeLoadURL(url string) { 78 | HWND, _ := syscall.GetProcAddress(mb.mbHandle, "wkeLoadURLW") 79 | syscall.Syscall(HWND, 2, mb.wkeWebView, StrPtr(url), 0) 80 | } 81 | 82 | var ( 83 | // kernel32, _ = syscall.LoadLibrary("kernel32.dll") 84 | // getModuleHandle, _ = syscall.GetProcAddress(kernel32, "GetModuleHandleW") 85 | 86 | user32, _ = syscall.LoadLibrary("user32.dll") 87 | messageBox, _ = syscall.GetProcAddress(user32, "MessageBoxW") 88 | ) 89 | 90 | func abort(funcname string, err error) { 91 | panic(funcname + " failed: " + err.Error()) 92 | } 93 | func MessageBox(caption, text string, style uintptr) (result int) { 94 | ret, _, _ := syscall.Syscall9(messageBox, 95 | 4, 96 | 0, 97 | StrPtr(text), 98 | StrPtr(caption), 99 | style, 100 | 0, 0, 0, 0, 0) 101 | 102 | result = int(ret) 103 | return 104 | } 105 | func main() { 106 | //num := MessageBox("Do你我他ne Title", "This test is Done.", 0x00000003) 107 | //退出信号 108 | mb := NewMb() 109 | mb.wkeInitialize() 110 | HWND := mb.wkeCreateWebWindow(uintptr(WKE_WINDOW_TYPE_POPUP), 0, 0, 0, 1080, 680) 111 | fmt.Println(int(HWND)) 112 | fmt.Println(int(mb.wkeWebView)) 113 | fmt.Println(int(mb.mbHandle)) 114 | mb.wkeShowWindow(true) 115 | //var fn = syscall.NewCallbackCDecl(cb_my) // 注意调用约定 116 | 117 | mb.wkeLoadURL("http://music.163.com/song?id=1296893537&userid=290764119") 118 | //启动一个新的协程来处理blink的API调用 119 | //<-make(chan bool) 120 | // 3. 主消息循环 121 | var msg winapi.MSG 122 | msg.Message = winapi.WM_QUIT + 1 // 让它不等于 winapi.WM_QUIT 123 | 124 | for winapi.GetMessage(&msg, 0, 0, 0) > 0 { 125 | winapi.TranslateMessage(&msg) 126 | winapi.DispatchMessage(&msg) 127 | } 128 | /*go func() { 129 | //将这个协程锁在当前的线程上 130 | runtime.LockOSThread() 131 | //消费API调用,同时处理好windows消息 132 | for { 133 | select { 134 | case job := <-jobQueue: 135 | job() 136 | default: 137 | //消息循环 138 | msg := &win.MSG{} 139 | if win.GetMessage(msg, 0, 0, 0) != 0 { 140 | win.TranslateMessage(msg) 141 | //是否传递下去 142 | next := true 143 | //拿到对应的webview 144 | 145 | if next { 146 | win.DispatchMessage(msg) 147 | } 148 | } 149 | } 150 | } 151 | }()*/ 152 | fmt.Println("0") //mb.wkeVersion() 153 | } 154 | --------------------------------------------------------------------------------