java 模拟用户点击java事件处理机制

博客分类:
事件处理是非常重要的,这一章讲讲常见的事件处理
1、关注/取消关注
2、菜单点击
事件类型介绍:
在微信中有事件请求是消息请求中的一种。请求类型为:event
而event事件类型又分多种事件类型,具体分
关注:subscribe
取消关注:unsubscribe
自定义菜单点击:CLICK
根据上面的类型分类可建对应的常量
* 请求消息类型:事件
public static final String REQ_MESSAGE_TYPE_EVENT = "event";
* 事件类型:subscribe(关注)
public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";
* 事件类型:unsubscribe(取消关注)
public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";
* 事件类型:CLICK(自定义菜单点击事件)
public static final String EVENT_TYPE_CLICK = "CLICK";
再在CoreServiceImpl中处理对应事件类型,先上CoreServiceImpl的源码
package com.ifp.weixin.biz.core.
import java.util.ArrayL
import java.util.D
import java.util.L
import java.util.M
import javax.servlet.http.HttpServletR
import org.apache.log4j.L
import org.springframework.stereotype.S
import com.ifp.weixin.biz.core.CoreS
import com.ifp.weixin.constant.C
import com.ifp.weixin.entity.Message.resp.A
import com.ifp.weixin.entity.Message.resp.NewsM
import com.ifp.weixin.entity.Message.resp.TextM
import com.ifp.weixin.util.MessageU
@Service("coreService")
public class CoreServiceImpl implements CoreService {
public static Logger log = Logger.getLogger(CoreServiceImpl.class);
public String processRequest(HttpServletRequest request) {
String respMessage =
// xml请求解析
Map&String, String& requestMap = MessageUtil.parseXml(request);
// 发送方帐号(open_id)
String fromUserName = requestMap.get("FromUserName");
// 公众帐号
String toUserName = requestMap.get("ToUserName");
// 消息类型
String msgType = requestMap.get("MsgType");
TextMessage textMessage = new TextMessage();
textMessage.setToUserName(fromUserName);
textMessage.setFromUserName(toUserName);
textMessage.setCreateTime(new Date().getTime());
textMessage.setMsgType(Constant.RESP_MESSAGE_TYPE_TEXT);
textMessage.setFuncFlag(0);
String respContent = "";
// 文本消息
if (msgType.equals(Constant.REQ_MESSAGE_TYPE_TEXT)) {
// 接收用户发送的文本消息内容
String content = requestMap.get("Content");
// 创建图文消息
NewsMessage newsMessage = new NewsMessage();
newsMessage.setToUserName(fromUserName);
newsMessage.setFromUserName(toUserName);
newsMessage.setCreateTime(new Date().getTime());
newsMessage.setMsgType(Constant.RESP_MESSAGE_TYPE_NEWS);
newsMessage.setFuncFlag(0);
List&Article& articleList = new ArrayList&Article&();
// 单图文消息
if ("1".equals(content)) {
Article article = new Article();
article.setTitle("我是一条单图文消息");
article.setDescription("我是描述信息,哈哈哈哈哈哈哈。。。");
article.setPicUrl("http://www.iteye.com/upload/logo/user/dc5ec35-073c-35e7-9b88-274d6b39d560.jpg");
article.setUrl("http://tuposky.iteye.com");
articleList.add(article);
// 设置图文消息个数
newsMessage.setArticleCount(articleList.size());
// 设置图文消息包含的图文集合
newsMessage.setArticles(articleList);
// 将图文消息对象转换成xml字符串
respMessage = MessageUtil.newsMessageToXml(newsMessage);
// 多图文消息
else if ("3".equals(content)) {
Article article1 = new Article();
article1.setTitle("我是一条多图文消息");
article1.setDescription("");
article1.setPicUrl("http://www.isic.cn/viewResourcesAction//logo/6032.jpg");
article1.setUrl("http://tuposky.iteye.com/blog/2008583");
Article article2 = new Article();
article2.setTitle("微信公众平台开发教程Java版(二)接口配置 ");
article2.setDescription("");
article2.setPicUrl("http://www.isic.cn/viewResourcesAction//logo/7254.jpg");
article2.setUrl("http://tuposky.iteye.com/blog/2008655");
Article article3 = new Article();
article3.setTitle("微信公众平台开发教程Java版(三) 消息接收和发送");
article3.setDescription("");
article3.setPicUrl("http://www.isic.cn/viewResourcesAction//logo/7031.jpg");
article3.setUrl("http://tuposky.iteye.com/blog/2017429");
articleList.add(article1);
articleList.add(article2);
articleList.add(article3);
newsMessage.setArticleCount(articleList.size());
newsMessage.setArticles(articleList);
respMessage = MessageUtil.newsMessageToXml(newsMessage);
//事件处理开始
} else if (msgType.equals(Constant.REQ_MESSAGE_TYPE_EVENT)) {
// 事件类型
String eventType = requestMap.get("Event");
if (eventType.equals(Constant.EVENT_TYPE_SUBSCRIBE)) {
respContent = "感谢您关注偶,这里会给您提供最新的公司资讯和公告!\n";
StringBuffer contentMsg = new StringBuffer();
contentMsg.append("您还可以回复下列数字,体验相应服务").append("\n\n");
contentMsg.append("1
我就是个测试的").append("\n");
contentMsg.append("2
我木有").append("\n");
contentMsg.append("3
我是多图文").append("\n");
respContent = respContent+contentMsg.toString();
} else if (eventType.equals(Constant.EVENT_TYPE_UNSUBSCRIBE)) {
// 取消关注,用户接受不到我们发送的消息了,可以在这里记录用户取消关注的日志信息
else if (eventType.equals(Constant.EVENT_TYPE_CLICK)) {
// 事件KEY值,与创建自定义菜单时指定的KEY值对应
String eventKey = requestMap.get("EventKey");
// 自定义菜单点击事件
if (eventKey.equals("11")) {
respContent = "天气预报菜单项被点击!";
} else if (eventKey.equals("12")) {
respContent = "公交查询菜单项被点击!";
textMessage.setContent(respContent);
respMessage = MessageUtil.textMessageToXml(textMessage);
} catch (Exception e) {
e.printStackTrace();
return respM
从第108行开始做事件处理,根据请求的事件类型,做出相应的反应。
菜单点击事件:
单独把菜单点击事件拉出来详细说说
用户点击自定义菜单后,如果菜单按钮设置为click类型,则微信会把此次点击事件推送给开发者,注意view类型(跳转到URL)的菜单点击不会上报。
参数说明:
要注意的是 EventKey 这个参数,与菜单创建的时候中的key值是对应的。
写出来的效果图为:依次触发的事件是
关注,点击天气预报菜单,点击公交查询菜单
事件处理讲到这里就结束了,
大家可加我的微信公众号一起讨论
微信公众号:andedaohang
或扫描二维码
我所有的博客都搬到csdn了,以后所有的博客都会在csdn上更新,
CSDN博客地址:
浏览: 69553 次
来自: 上海
看了楼主的文章写的很好啊,由于学习这个微信公众号开发找了很久的 ...
&div class=&quote_title ...
具体值是 &text&
LZ是基于jdk1.5做的吗
一点封装性也谈不上啊
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'使用Java自动化方法模拟Android手机点击、触屏事件
最近有一个测试需求,需要重复性的滑动手机、对手机进行触摸、点击操作等,所以就需要实现一个Android模拟人工操作的功能。一开始想写一个APK,但在实现过程中遇上了麻烦,好像需要系统应用权限等,笔者本身并不是做Android开发的,所以就没有实现。最后是通过adb shell 实现了该功能。Java开启线程,结合键盘和鼠标事件,使用adb shell控制手机。详解如下。
一、所需知识
1、最基础的adb shell 指令。input tab 等。2、Java自动化基础知识。java.awt.Robot3、无二、所需环境硬件:一台电脑、一部手机、一根数据线。软件:jdk、adb工具三、编码1、Java模拟鼠标点击操作方法
//实现鼠标左键点击操作
public static void pressMouse(Robot r,int m,int delay){r.mousePress(m);r.delay(10);r.mouseRelease(m);}
2、Java模拟鼠标移动操作
//实现将鼠标移动到电脑屏幕 x=518,y=339的位置
Robot rb = new Robot();rb.mouseMove(518,339);rb.delay(500);
3、Java模拟键盘输入操作
public static void pressKey(Robot robot,int keyEvent){
robot.keyPress(keyEvent);
robot.keyRelease(keyEvent);
robot.delay(50);}
//该代码可实现输出“a”
pressKey(rb,KeyEvent.VK_A);
4、简单的adb指令
//进入shell
input tab 980 900
//点击手机 x=980
input swipe 540 480 540 190
//手机向上滑动290像素
input keyevent 4 //返回
5、开启Java线程
new Thread(){
Robot rb = new Robot();
public void run() {
while (true) {
四、使用方法
通过上述4个方法已经能够实现使用Java自动化控制Android手机达到控制手机的目的。具体使用方法如下:
1、打开cmd(windows 控制台)
platform-tools文件夹(该文件可通过附件下载)下
3、打开手机开发者选项并开启USB调试选项(各手机型号开启不一样,可自行百度)
4、输入 adb shell
5、输入 input tab 980 900
6、输入 input swipe 540 480 540 190
7、输入 input keyevent 4
注:4/5/6/7为人工输入,只是方便读者体验adb shell的功能。这4步使用程序可代替人工操作。
上述内容可实现使用Java自动化控制Android手机达到控制手机的功能,附件代码中结合了JavaSwing实现了窗体化,与本文无关,可忽略。代码及platform-tools已上传。下载地址:http://download.csdn.net/download/fanguoddd/
想设置资源分为0还不行。。。(建议看完代码逻辑后再运行,否则容易停不住。。)。欢迎大家在评论区交流。
最后,打波广告。微信搜索公众号"省钱潮",公众号微信号:IT
淘宝购物领券,专为你省钱。
Android后台模拟点击探索(附源码)
Android系统上实现类似按键精灵的效果(模拟触屏点击事件)
谈Android模拟点击的价值和实现
Android在任何地方模拟点击屏幕
Android模拟点击屏幕,实现按键精灵点击屏幕功能
Android:自动点击屏幕
【Android】技术调研:用代码模拟屏幕点击、触摸事件
Android 自动点击
Android通过代码模拟物理、屏幕点击事件
Android开发——Accessibility机制实现模拟点击(微信自动抢红包实现)
没有更多推荐了,查看:25877|回复:12
最近写了一个java模拟键盘按键的例子,现在来给大家分享下。。。
1.打开一个记事本
3.模拟按键操作
现 贴出 源码 :import java.awt.AWTE
import java.awt.R
import java.awt.T
import java.awt.datatransfer.C
import java.awt.datatransfer.StringS
import java.awt.datatransfer.T
import java.awt.event.KeyE
public class Test {
& && &&&/**
& && && &* @param args
& && && &* @throws AWTException
& && && &*/
& && &&&public static void main(String[] args) throws Exception {
& && && && && & // TODO Auto-generated method stub
& && && && && & Robot robot = new Robot(); //创建一个robot对象
& && && && && & Runtime.getRuntime().exec(&notepad&);& && &&&//打开一个记事本程序
& && && && && & robot.delay(2000);& && &&&//等待 2秒
& && && && && & //窗口最大化
& && && && && & keyPressWithAlt(robot, KeyEvent.VK_SPACE); //按下 alt+ 空格
& && && && && & keyPress(robot, KeyEvent.VK_X);&&//按下x键
& && && && && & robot.delay(1000);&&//等待 1秒
& && && && && & keyPressString(robot, &大家好,我是一个小机器人,我有很多本领呢 !&); //输入字符串
& && && && && & robot.delay(3000);&&//等待 3秒
& && && && && & keyPress(robot, KeyEvent.VK_ENTER); // 按下 enter 换行
& && && && && & keyPressString(robot, &现在,我就向大家展示一下.....嘻嘻&); //输入字符串
& && && && && & robot.delay(3000);&&//等待 3秒
& && && && && & keyPress(robot, KeyEvent.VK_ENTER); // 按下 enter 换行
& && && && && & keyPressString(robot, &首先,我能按下 键盘的任何一个键。下面,我单独按下a,b,c,d键&); //输入字符串
& && && && && & keyPress(robot, KeyEvent.VK_ENTER); // 按下 enter 换行
& && && && && & robot.delay(3000);&&//等待 3秒
& && && && && & keyPress(robot, KeyEvent.VK_A); //按下 a 键
& && && && && & robot.delay(2000);&&//等待 2秒
& && && && && & keyPress(robot, KeyEvent.VK_B); //按下 b 键
& && && && && & robot.delay(2000);&&//等待 2秒
& && && && && & keyPress(robot, KeyEvent.VK_C); //按下 c 键
& && && && && & robot.delay(2000);&&//等待 2秒
& && && && && & keyPress(robot, KeyEvent.VK_D); //按下 d 键
& && && && && & robot.delay(2000);&&//等待 2秒
& && && && && & keyPress(robot, KeyEvent.VK_ENTER); // 按下 enter 换行
& && && && && & keyPressString(robot, &呵呵,完成了。。。。&&&);
& && && && && & robot.delay(3000);&&//等待 3秒
& && && && && & keyPress(robot, KeyEvent.VK_ENTER); // 按下 enter 换行
& && && && && & keyPressString(robot, &恩,对了& & 上面 文字很多&&是不是 感到 很乱呢???& &&&我现在 帮你清空一下 &);
& && && && && & robot.delay(2000);&&//等待 2秒
& && && && && & keyPressWithCtrl(robot,KeyEvent.VK_A); //按下 ctrl+A 全选
& && && && && & robot.delay(2000);&&//等待 2秒
& && && && && & keyPress(robot,KeyEvent.VK_DELETE); //清除
& && && && && & robot.delay(3000);&&//等待 3秒
& && && && && & keyPressString(robot, &恩,现在 是不是 觉得 清爽多了& && && && &&&另外 我还会按 组合键呢 ...&);
& && && && && & keyPress(robot, KeyEvent.VK_ENTER); // 按下 enter 换行
& && && && && & robot.delay(3000);&&//等待 3秒
& && && && && & keyPressString(robot, &................好像已经 演示过了 吧 ,呵呵& & &);
& && && && && & keyPress(robot, KeyEvent.VK_ENTER); // 按下 enter 换行
& && && && && & robot.delay(3000);&&//等待 3秒
& && && && && & keyPressString(robot, &其实,我还有很多本领呢& && && && && && && && && &现在就不向大家展示了 .....&);
& && && && && & keyPress(robot, KeyEvent.VK_ENTER); // 按下 enter 换行
& && && && && & robot.delay(3000);&&//等待 3秒
& && && && && & keyPressString(robot, &谢谢大家!!!!!&);
& && && && && &
& && && && && &
& && &&&// shift+ 按键
& && &&&public static void keyPressWithShift(Robot r, int key) {
& && && && && & r.keyPress(KeyEvent.VK_SHIFT);
& && && && && & r.keyPress(key);
& && && && && & r.keyRelease(key);
& && && && && & r.keyRelease(KeyEvent.VK_SHIFT);
& && && && && & r.delay(100);
& && &&&// ctrl+ 按键
& && &&&public static void keyPressWithCtrl(Robot r, int key) {
& && && && && & r.keyPress(KeyEvent.VK_CONTROL);
& && && && && & r.keyPress(key);
& && && && && & r.keyRelease(key);
& && && && && & r.keyRelease(KeyEvent.VK_CONTROL);
& && && && && & r.delay(100);
& && &&&// alt+ 按键
& && &&&public static void keyPressWithAlt(Robot r, int key) {
& && && && && & r.keyPress(KeyEvent.VK_ALT);
& && && && && & r.keyPress(key);
& && && && && & r.keyRelease(key);
& && && && && & r.keyRelease(KeyEvent.VK_ALT);
& && && && && & r.delay(100);
& && &&&//打印出字符串
& && &&&public static void keyPressString(Robot r, String str){
& && && && && & Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();//获取剪切板
& && && && && & Transferable tText = new StringSelection(str);
& && && && && & clip.setContents(tText, null); //设置剪切板内容
& && && && && & keyPressWithCtrl(r, KeyEvent.VK_V);//粘贴
& && && && && & r.delay(100);
& && &&&//单个 按键
& && &&&public static void keyPress(Robot r,int key){
& && && && && & r.keyPress(key);
& && && && && & r.keyRelease(key);
& && && && && & r.delay(100);
}谢谢大家!
本帖最后由 yuke198907 于
09:23 编辑
感谢楼主分享~~~~
菜鸟表示看着吃力
挺有意思的例子
引用:原帖由 你先上 于
09:55 发表
菜鸟表示看着吃力 没关系 ,我只是 觉得 代码操作键盘 很有意思 所以就分享了&&娱乐 一下。。
引用:原帖由 w 于
13:33 发表
没关系 ,我只是 觉得 代码操作键盘 很有意思 所以就分享了&&娱乐 一下。。 恩 我也努力学习 早点看懂
引用:原帖由 yuke198907 于
16:36 发表
等学习的深入了就明白了 是的。。。。。。。。。
助理工程师
完全不懂JAVA&&还是看一遍把
中级工程师
论坛首席砖家
楼上的广告。。
使用Robot对象模拟键盘
还挺有意思的、
蛮有意思的嘛
感谢分享 我真的好崇拜
引用:原帖由 zhg1016 于
21:52 发表
感谢分享 我真的好崇拜 谢谢& &和你一样&&我也是个新手& & 只是感觉有趣/*************--:
如何使用Java模拟登陆ajax+js的onclick事件post数据的网站****/ - ITeye问答
&&&&& 最近在试着做一个如上所述的程序. 目前用的是HttpClient包. 发现并不能通过. 没找到别的方法,望诸位能帮忙出出主意. 目标网站在登陆界面是用户点击登陆,触发onclick事件后提交数据,局部刷新数据的.
问题补充:javahead 写道HttpClient完全可以实现网络通信,建议到网上下载几个教程和例子,仔细研究下
Java控件模型都有很好的封装,创建销毁,做局部刷新是再正常不过的了
谢谢你热心的回答.是这样,我用http头查看工具看了对方传递的参数,然后我把他的参数post过去之后总是不能成功, 你可否给我看一下?
问题补充:javahead 写道不太明白你的意思,HttpClient是用来提交请求的,只需要服务器的地址和端口就可以了,例如一个Serverlet,处理完后返回,可在PostMethod中取得返回的内容
我提个无理的要求,我能加你好友向你请教吗? 实在是让它烦透了.
不太明白你的意思,HttpClient是用来提交请求的,只需要服务器的地址和端口就可以了,例如一个Serverlet,处理完后返回,可在PostMethod中取得返回的内容
HttpClient完全可以实现网络通信,建议到网上下载几个教程和例子,仔细研究下
Java控件模型都有很好的封装,创建销毁,做局部刷新是再正常不过的了
已解决问题
未解决问题博客分类:
新换的手机,屏幕有点大,操作起来有点费劲,找了一些虚拟按键类的软件,都不是很简洁,最后想写个虚拟返回按钮。
Instrumentation inst=new Instrumentation();
inst.sendKeyDownUpSync(KeyCode);
这段代码在非UI线程调用可以达到返回键的效果,但是不能跨进程(怒!不能跨进程要你何用)。严格来讲不是不能,而是比较麻烦。
http://www.cnblogs.com/TerryBlog/archive//2539866.html
这篇帖子看似给出方案。用ndk封装的方式忽略。第二种修改为系统进程的方式需要源码环,拿到公钥等,除了自己编译的rom,其他的rom不可能拿到这些。
还有一种方式是:
private void sendKeyEvent(int keyCode) {
int eventCode = keyC
long now = SystemClock.uptimeMillis();
KeyEvent down = new KeyEvent(now, now, KeyEvent.ACTION_DOWN, eventCode, 0);
KeyEvent up = new KeyEvent(now, now, KeyEvent.ACTION_UP, eventCode, 0);
(IWindowManager.Stub
.asInterface(ServiceManager.getService("window")))
.injectInputEventNoWait(down);
(IWindowManager.Stub
.asInterface(ServiceManager.getService("window")))
.injectInputEventNoWait(up);
} catch (RemoteException e) {
Log.i(TAG, "DeadOjbectException");
这种方式在1.6版本以后就被放弃了删掉了,新版系统源码中根本就没有这个类
最终的解决办法:
上述帖子三楼给出了模拟系统协议的方式。这种方式可以跨进程,但是需要root
大部分虚拟按键类软件都是这么做的。
这个开源项目就是一个很好的例子:国人开发的
https://code.google.com/p/assistivetouch/
提取其中关键类和代码 如下:
RootContext.java
package com.leon.assistivetouch.main.
import java.io.DataOutputS
import java.io.F
import java.io.FileOutputS
import java.io.InputStreamR
import java.io.OutputS
import java.io.OutputStreamW
import android.content.C
RootContext.java
获取root权限
* 创建日期
* 更新时间
* 最后更新者 $Author$
public class RootContext {
private static RootContext instance =
private static Object mLock = new Object();
private RootContext(String cmd) throws Exception {
this.mShell =
public static RootContext getInstance() {
if (instance != null) {
synchronized (mLock) {
instance = new RootContext("su");
} catch (Exception e) {
while (true)
instance = new RootContext("/system/xbin/su");
} catch (Exception e2) {
instance = new RootContext("/system/bin/su");
} catch (Exception e3) {
e3.printStackTrace();
private void init() throws Exception {
if ((this.p != null) && (this.o != null)) {
this.o.flush();
this.o.close();
this.p.destroy();
this.p = Runtime.getRuntime().exec(this.mShell);
this.o = this.p.getOutputStream();
system("LD_LIBRARY_PATH=/vendor/lib:/system/lib ");
private void system(String cmd) {
this.o.write((cmd + "\n").getBytes("ASCII"));
} catch (Exception e) {
while (true)
} catch (Exception e1) {
e1.printStackTrace();
public void runCommand(String cmd) {
system(cmd);
* 判断是否已经root了
public static boolean hasRootAccess(Context ctx) {
final StringBuilder res = new StringBuilder();
if (runCommandAsRoot(ctx, "exit 0", res) == 0)
} catch (Exception e) {
* 以root的权限运行命令
public static int runCommandAsRoot(Context ctx, String script,
StringBuilder res) {
final File file = new File(ctx.getCacheDir(), "secopt.sh");
final ScriptRunner runner = new ScriptRunner(file, script, res);
runner.start();
runner.join(40000);
if (runner.isAlive()) {
runner.interrupt();
runner.join(150);
runner.destroy();
runner.join(50);
} catch (InterruptedException ex) {
return runner.
private static final class ScriptRunner extends Thread {
private final F
private final S
private final StringB
public int exitcode = -1;
public ScriptRunner(File file, String script, StringBuilder res) {
this.file =
this.script =
this.res =
public void run() {
file.createNewFile();
final String abspath = file.getAbsolutePath();
Runtime.getRuntime().exec("chmod 777 " + abspath).waitFor();
final OutputStreamWriter out = new OutputStreamWriter(
new FileOutputStream(file));
if (new File("/system/bin/sh").exists()) {
out.write("#!/system/bin/sh\n");
out.write(script);
if (!script.endsWith("\n"))
out.write("\n");
out.write("exit\n");
out.flush();
out.close();
exec = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(exec.getOutputStream());
os.writeBytes(abspath);
os.flush();
os.close();
InputStreamReader r = new InputStreamReader(
exec.getInputStream());
final char buf[] = new char[1024];
int read = 0;
while ((read = r.read(buf)) != -1) {
if (res != null)
res.append(buf, 0, read);
r = new InputStreamReader(exec.getErrorStream());
while ((read = r.read(buf)) != -1) {
if (res != null)
res.append(buf, 0, read);
if (exec != null)
this.exitcode = exec.waitFor();
} catch (InterruptedException ex) {
if (res != null)
res.append("\nOperation timed-out");
} catch (Exception ex) {
if (res != null)
res.append("\n" + ex);
} finally {
destroy();
public synchronized void destroy() {
if (exec != null)
exec.destroy();
模拟按键指令:
RootContext.getInstance().runCommand("input keyevent " + KeyEvent.KEYCODE_BACK);
ps:缺点,反应慢。想想这也是市面上找不到像样的虚拟按键类软件的原因吧,体验太差。
最后的最后,放弃了。凑合着用吧。
jianweicao
浏览: 57468 次
来自: 北京
有些邮箱,使用pop3 或者smtp发信的时候,是没法保存已发 ...
提问:在我的项目里用到了ajaxFileUpload.js,但 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 java点击按钮触发事件 的文章

 

随机推荐