Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
energye
energy
提交
1bb94c4c
energy
项目概览
energye
/
energy
通知
13
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
energy
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
1bb94c4c
编写于
10月 09, 2023
作者:
yanghye
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
U: demo chromium模拟事件
上级
5063477b
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
52 addition
and
38 deletion
+52
-38
example/mockevent/mockevent.go
example/mockevent/mockevent.go
+47
-35
example/mockevent/resources/index.html
example/mockevent/resources/index.html
+5
-3
未找到文件。
example/mockevent/mockevent.go
浏览文件 @
1bb94c4c
...
...
@@ -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"
])
})
})
//运行应用
...
...
example/mockevent/resources/index.html
浏览文件 @
1bb94c4c
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录