提交 1bb94c4c 编写于 作者: yanghye's avatar yanghye

U: demo chromium模拟事件

上级 5063477b
......@@ -7,7 +7,6 @@ import (
"github.com/energye/energy/v2/cef/ipc"
"github.com/energye/energy/v2/cef/ipc/target"
"github.com/energye/energy/v2/consts"
"time"
)
//go:embed resources
......@@ -25,6 +24,19 @@ func main() {
FS: &resources, //静态资源所在的 embed.FS
}.Build())
/*
1. 仅在主进程中使用ipc监听renderLoadEnd事件
2. 在渲染进程中的app.SetOnRenderLoadEnd监听渲染进程页面加载结束事件,在这个事件里获取页面html元素位置和大小
3. html元素位置和大小获取之后触发主进程监听事件, 把要获取到的html元素位置和大小发送到主进程renderLoadEnd事件
4. 主进程renderLoadEnd事件被触发后使用渲染进程传递的元素数据模拟事件操作
模拟事件使用当前窗口chromium或者browser提供的函数
chromium.SendXXX 只能在主进程中使用
browser.SendXXX 可在主进程或渲染进程中直接使用
*/
// 在渲染进程中处理结束事件
// 通过VisitDom获取html元素的位置和大小
// SetOnVisit 函数只能在渲染进程中执行
app.SetOnRenderLoadEnd(func(browser *cef.ICefBrowser, frame *cef.ICefFrame, httpStatusCode int32) {
// 创建 dom visitor
visitor := cef.DomVisitorRef.New()
......@@ -32,49 +44,49 @@ func main() {
// 这个事件在渲染进程中才会执行
visitor.SetOnVisit(func(document *cef.ICefDomDocument) {
body := document.GetBody()
btn1 := body.GetDocument().GetElementById("btn1")
btn2 := body.GetDocument().GetElementById("btn2")
btn3 := body.GetDocument().GetElementById("btn3")
inpText := body.GetDocument().GetElementById("inpText")
fmt.Println("inpText", inpText.GetElementBounds())
ipc.EmitTarget("dom", target.NewTargetMain(), 1, 2)
var doms = make(map[string]cef.TCefRect)
doms["btn1"] = btn1.GetElementBounds()
doms["btn2"] = btn2.GetElementBounds()
doms["btn3"] = btn3.GetElementBounds()
doms["inpText"] = inpText.GetElementBounds()
ipc.EmitTarget("renderLoadEnd", target.NewTargetMain(), doms)
})
fmt.Println("visitor:", visitor)
frame.VisitDom(visitor)
})
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, window cef.IBrowserWindow) {
var isLoad bool
// 模拟一个其它任务中执行鼠标事件
var mockEvent = func() {
var domXYCenter = func(bound cef.TCefRect) (int32, int32) {
return bound.X + bound.Width/2, bound.Y + bound.Height/2
}
// 模拟按钮点击事件
var buttonClickEvent = func(domRect cef.TCefRect) {
// 页面加载完之后
for {
if isLoad {
break
}
time.Sleep(time.Second) //一秒后执行
window.RunOnMainThread(func() { //在UI主线程
chromium := window.Chromium()
// 鼠标事件
me := &cef.TCefMouseEvent{}
/*
演示的是点击界面左上角Button按钮, 前提是需要知道按钮在界面的坐标
*/
// 设置坐标 相当于窗口内
me.Y = 12
me.X = 25
// 模拟鼠标到指定位置
chromium.SendMouseMoveEvent(me, false)
// 模拟鼠标双击事件
// 左键点击按下1次
chromium.SendMouseClickEvent(me, consts.MBT_LEFT, false, 1)
// 左键点击抬起1次
chromium.SendMouseClickEvent(me, consts.MBT_LEFT, true, 1)
window.RunOnMainThread(func() { //在UI主线程
chromium := window.Chromium()
// 鼠标事件
me := &cef.TCefMouseEvent{}
// 设置元素坐标,元素坐标相对于窗口,这里取元素中间位置
me.X, me.Y = domXYCenter(domRect)
fmt.Println("buttonClickEvent", me)
// 模拟鼠标到指定位置
chromium.SendMouseMoveEvent(me, false)
// 模拟鼠标双击事件
// 左键点击按下1次
chromium.SendMouseClickEvent(me, consts.MBT_LEFT, false, 1)
// 左键点击抬起1次
chromium.SendMouseClickEvent(me, consts.MBT_LEFT, true, 1)
// 模拟文本框
//chromium.SendKeyEvent()
})
}
})
}
ipc.On("dom", func(s, a int) {
fmt.Println("dom", s, a)
mockEvent()
ipc.On("renderLoadEnd", func(doms map[string]cef.TCefRect) {
fmt.Println("doms", doms)
buttonClickEvent(doms["btn1"])
buttonClickEvent(doms["btn2"])
buttonClickEvent(doms["btn3"])
})
})
//运行应用
......
......@@ -4,14 +4,16 @@
<meta charset="UTF-8">
<title></title>
<script>
function btnClick() {
function btnClick(m) {
let msg = document.getElementById("msg")
msg.innerHTML += "mouse click<br>"
msg.innerHTML += m.innerText + "<br>"
}
</script>
</head>
<body>
<button onclick="btnClick()">Button</button>
<button onclick="btnClick(this)" id="btn1">Button1</button>
<button onclick="btnClick(this)" id="btn2">Button2</button>
<button onclick="btnClick(this)" id="btn3">Button3</button>
<br>
<input type="text" id="inpText"><br>
<div id="msg"></div>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册