按键精灵触摸命令获取用户触摸屏幕事件

【安卓模拟器按键】安卓使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)_牛宝宝文章网【安卓模拟器按键】安卓使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)专题:安卓使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)有时我们需要使用安卓实现在后台模拟系统按键,比如对音量进行调节(模拟音量键),关闭前台正在运行的App(模拟返回键),或者模拟触屏事件。(WWw.niUbB.nEt)但是对于原生安卓系统而言,后台进程关闭前台进程,甚至模拟用户事件,进而操控整个系统,是不符合系统安全原则的,如果有这样的漏洞被病毒或恶意软件所利用,会非常危险。由于一些特殊原因,我恰巧需要实现这样的功能,而又没有条件自行编译安卓系统(但是可以利用Root权限,因为Root权限的获取相对简单很多,并且很多用户的安卓设备都有Root过)。网上也看到很多人在提类似的问题,很多人讨论了半天,结果都是无解。于是我花了很大精力,最后终于找到了解决方案。在网上查找了很多资料,主要找到两种方法:Instrumentation和IWindowManager。使用Instrumentation接口:对于非自行编译的安卓系统,无法获取系统签名,只能在前台模拟按键,不能后台模拟。一种是使用Instrumentation接口,这个接口原本是用来对软件进行测试而留出来的。经过尝试,发现这个接口可以模拟按键,但是前提是在应用处于前台时。而应用处于前台时,模拟按键基本上也没有太大的作用(模拟按键操作应用自身似乎没有很大意义)。当应用处于后台时,这个Instrumentation接口就失效了。网上找到的解释是,在后台使用这个接口,需要有系统权限,也就是在Manifest中添加android:sharedUserId="android.uid.system"。而这会导致什么问题呢?声明了系统权限的APK,只有具有系统签名的情况下,才能被安装到安卓设备上,比如系统自带的电话、短信,本质上也就是APK程序,但是这些应用具有系统权限。安卓系统有一套签名机制,APK只有有了数字签名,才能被安装。通常调试时默认Eclipse自动对其进行签名,使用的是Debug签名。当发布应用时,开发者则使用自己独有的数字签名文件对APK进行签名(这个文件可以用Eclipse生成,签名也可以让Eclipse完成)。APK有新版本的安装时,如果检测到签名不一致,系统会提示签名不一致,只有卸载旧版本才能安装。这一机制从一定程度上避免了第三方对官方发布的APK进行修改甚至非法植入病毒等行为(当然如果用户主动卸载旧版本的官方应用、安装新版本的非官方APK也是可以的)。而具有同一签名的不同App,它们之间可以共享一些数据。而系统签名怎么获取呢?在编译安卓系统的时候,会将一个系统签名的数字签名文件放到一起编译。对于一个已经编译完成的系统,或者为了适配不同系统,必然无法获取到这个数字签名文件,于是也无法对APK进行系统签名。最后就导致具有uid.system属性的APK无法被安装,于是Instrumentation接口后台模拟按键的方法,只能在自行编译系统的情况下才可以使用。使用反射方法调用系统IWindowManager隐藏API:兼容性较差,稳定性不好,容易出错。另外实际编译时发生错误,原因暂时不明。网上还有一种方法。安卓系统中有一些隐藏API,通常是利用Java的权限限制,使得这些API无法被调用。但通过反射的方式,可以突破Java的权限限制。在IWindowManager中就隐藏了可以模拟按键和触屏事件的API。尝试网上的方法,下载到一个由安卓源码编译好的jar文件,添加到工程中,然后使用发射编写了一些代码,尝试调用隐藏API。结果编译的时候Eclipse直接不响应了,可能是因为电脑配置不够,jar文件太大。尝试了几次没有成功,又考虑到这种方法有很多弊端,并且很可能最后还是需要系统权限(网上不少说得不是很清楚),于是就放弃了这个方法。android模拟按键问题总结[使用IWindowManager.injectKeyEvent方法]http://blog.csdn.net/xudongdong99/article/details/8857173Android中使用隐藏API(大量图解)http://163liufuliang./blog/static//JNI调用C程序模拟按键:仍然是权限问题。参考了网上一些资料所提出的可能的思路,发现剩下能想到的方法就是用JNI实现,通过调用C/C++程序来模拟按键。对Linux底层编程不熟悉,网上参考了一些代码,在Ubuntu下编写了一个按键模拟程序,很顺利的编译运行通过。然后又开始学习JNI的编译方法,先在C程序层写了个简单的加法运算,编译运行测试通过,然后就把模拟按键的代码贴了进去。满怀期待的写好安卓Java层代码,编译、下载、执行程序,却发现完全没有效果。想看一下到底是哪一步出错了,就在C程序里面改了改,用LogCat打印出C程序的返回值,发现在打开按键设备的时候出错,看来肯定又是权限的问题了。尽管系统已经Root,APK也允许使用Root权限,但是Root权限没法传递给C程序,权限不够,程序无法执行。在网上找了一通有关Linux、安卓权限的资料,也没找出来什么思路。其实当时很疑惑,在Linux系统中,Root权限是最高的权限,安卓也不例外,有文章指出,Root权限&系统权限&用户权限。尽管能获取到Root权限,却不能完成系统权限所能完成的任务,总感觉不应该。安卓按键精灵:使用Root权限而不需系统签名,实现后台模拟按键和触屏等事件是可行的。当时很绝望,感觉估计只有自行编译系统才能解决问题了。就在那时候,突然想起了按键精灵软件。以前用过电脑版,在安卓市场一找,果然也有安卓版。下载使用发现,按键精灵就可以实现在后台模拟按键操作,需要Root权限,但是是什么原理却不得而知。本想尝试反编译源码查看,但是当时出了一些问题,反编译没有成功。在网上搜索安卓按键精灵的原理,除了之前的那两种依赖源码环境才能使用的API,也没有找到结果。不过至少说明了,使用Root权限而不需要系统签名,实现模拟按键、并且兼容大量安卓设备是可行的。最终解决问题:使用Shell调用ADB指令实现。继续在网上搜索安卓按键模拟(其实那时都不知道用什么关键字好了,能想到的关键字都用遍了,但是搜索出来的结果,都是之前提到的那几个依赖源码环境和系统权限的方案)。发现有很多介绍ADB调试,向手机发送按键事件的文章。刚好之前做过在Root权限下,用Java调用安卓底层的Linux Shell,然后执行pm指令进行APK的安装卸载。这时我突发奇想,能否用Shell调用ADB指令呢?转载请保留本文连接:1分享到:相关文章声明:《【安卓模拟器按键】安卓使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)》由“贼公”分享发布,如因用户分享而无意侵犯到您的合法权益,请联系我们删除。TA的分享求大神指导,有没有办法获得屏幕点击的坐标(响应触屏事件) _ 按键精灵手机版 - 按键精灵论坛
腾讯微博:
软件版本:2014.05软件大小:76.8M更新时间:2-21
软件版本:3.2.5软件大小:62.5M更新时间:06-06
软件版本:1.2.6软件大小:29.2M更新时间:05-25
软件版本:1.1.0软件大小:12.3M更新时间:12-29
查看: 1814|回复: 10
就是类似录制功能那样,可以知道点击了屏幕的哪个地方,返回坐标值给我简单的说就是 能不能捕获触屏事件,既知道用户何时点击了屏幕,也知道点击的坐标求大神指导啊
找了一天的资料都没找合适的
按键精灵开发者6级(新浪V认证)通过新浪微博加V后自动发放,并替换普通的认证6级勋章。 微博达人(90天)完成新浪微博加V的奖励,结合活动不定期开放申请。学有所成学有所成勋章,新手步入按键学堂的第一枚勋章活动狂人论坛活动狂人黄金之翼黄金之翼勋章按键明星按键明星勋章天使勋章天使一样的用户按键会员(月)按键会员绑定账号后自动赠送
1,用画板 全屏找色 记录位置2,等录制功能出来把
炉石传说交流群     按键精灵交流群     接单QQ
yangxingguo20
按键精灵开发者2级可通过提升认证等级来升级勋章:学有所成学有所成勋章,新手步入按键学堂的第一枚勋章黄金之翼黄金之翼勋章
没有你说的这种功能,就连PC版的也没有。录制只能录制用户的操作。
安卓手机脚本定制联系QQ:
yangxingguo20 发表于
20:11 没有你说的这种功能,就连PC版的也没有。录制只能录制用户的操作。不是吧……既然录制能确定屏幕坐标,为什么脚本里就不能弄个像录制一样的确定坐标的功能悲剧…………
19:26 1,用画板 全屏找色 记录位置2,等录制功能出来把我点击的地方是随机的 全屏找色……没有固定颜色……
yangxingguo20
按键精灵开发者2级可通过提升认证等级来升级勋章:学有所成学有所成勋章,新手步入按键学堂的第一枚勋章黄金之翼黄金之翼勋章
<font color="#2207980 发表于
22:44 不是吧……既然录制能确定屏幕坐标,为什么脚本里就不能弄个像录制一样的确定坐标的功能悲剧…………不好意思啊,刚才看花眼了,我把坐标看成图标了,录制功能倒是没有,但是你想找坐标的话就简单了,抓抓功能里面可以获取截图某个点的坐标,CTRL+数字0—9,这个可以获取坐标和颜色值,你若是没有固定的颜色值的话脚本根本不知道你想找什么。
安卓手机脚本定制联系QQ:
yangxingguo20 发表于
01:23 不好意思啊,刚才看花眼了,我把坐标看成图标了,录制功能倒是没有,但是你想找坐标的话就简单了,抓抓功 ...不能用抓抓,我要做的脚本是
当我点击一个位置后,返回个坐标给我,然后我需要针对那个坐标做一系列操作,至于我点击哪个 是根据情况而定的,抓抓是在编写脚本前确定坐标而我要的是在脚本运行时才确定坐标
按键精灵开发者2级可通过提升认证等级来升级勋章:
据我所知无法实现
yangxingguo20
按键精灵开发者2级可通过提升认证等级来升级勋章:学有所成学有所成勋章,新手步入按键学堂的第一枚勋章黄金之翼黄金之翼勋章
我知道你的大概意思了,应该是某种会移动或者会随机出现的东西,当找到后点击他,然后再对他执行操作。这个东西点击以后菜单是跟随这个东西的对吧,这个只能你自己思考了。
安卓手机脚本定制联系QQ:
按键精灵开发者1级可通过提升认证等级来升级勋章:天使勋章天使一样的用户土豪勋章(90天)活动期间在淘宝商场购买按键产品体验先锋勋章新版本体验先锋纪念勋章(360天)猴年勋章猴年专属“大圣”勋章过大年勋章俩小福娃给大家拜年啦!
我的点击事件,请置顶,方便其他人进链接
按键精灵开发者1级可通过提升认证等级来升级勋章:天使勋章天使一样的用户土豪勋章(90天)活动期间在淘宝商场购买按键产品体验先锋勋章新版本体验先锋纪念勋章(360天)猴年勋章猴年专属“大圣”勋章过大年勋章俩小福娃给大家拜年啦!
camingo 发表于
11:54 据我所知无法实现关于按钮单击事件 _ 会员专区 - 按键精灵论坛
腾讯微博:
软件版本:2014.05软件大小:76.8M更新时间:2-21
软件版本:3.2.5软件大小:62.5M更新时间:06-06
软件版本:1.2.6软件大小:29.2M更新时间:05-25
软件版本:1.1.0软件大小:12.3M更新时间:12-29
查看: 219|回复: 1
a(5)a(0)=&三七&......b=&三七&If instr(join(a), b) & 0 Then
Call buy_药材()end If这段代码直接运行是可以运行的但是在 按钮单击事件中却不能运行
提示类型不匹配 “ join”求解惑
按键工程师&#183;兼职
按键15周年庆纪念勋章按键15周年庆纪念勋章(365天)过大年勋章俩小福娃给大家拜年啦!双十一绝版纪念勋章双十一绝版纪念勋章抗战胜利70周年勋章抗战胜利70周年活动的专属勋章单身汪勋章单身贵族的专属勋章按键14周年庆纪念勋章按键14周年庆纪念勋章(360天)按键学院按键学院专属勋章,按键学院学员或文章被院刊收入可领取幸运草勋章(永久)商业小精灵限时活动勋章。马年勋章(360天) 马年纪念勋章(360天)年全勤论坛连续打卡签到365次以上(365天)月全勤论坛自然月(如8.1-8.31)签到满勤,系统会在月底自动判断发放。鹰眼勋章鹰眼注册用户专属勋章黄瓜勋章(永久)体验商业小精灵活动的奖励天使勋章天使一样的用户按键明星按键明星勋章黄金之翼黄金之翼勋章举报达人长期举报不良帖子活动狂人论坛活动狂人骨灰级按键用户3年以上的按键论坛用户按键精灵开发者6级可通过提升认证等级来升级勋章:龙年勋章(360天)龙年纪念勋章(360天)十周年勋章(360天)十周年纪念勋章兔年勋章(360天)兔年纪念勋章(360天)论坛GG按键论坛男性用户勋章小红帽对论坛提出良好建议(可向管理员申请)发帖高手鼓励积极回复,但注意不要灌水哦爱心大使积极帮助新手(可向管理员进行申请)学有所成学有所成勋章,新手步入按键学堂的第一枚勋章实习版主按键论坛的实习版主专属勋章按键元老资深按键用户的尊贵荣誉勋章管理人员按键论坛的管理团队专属勋章
回复 Event Form1.Button1.Click
Dim a(5)&#39;需要写在控件内 控件事件内外值不共通
a(0)=&三七&
If instr(join(a), b) & 0 Then
MsgBox &包含&
自命不凡,其实很落魄个人QQ:让我静静想一想 曾经的过往有过精彩也有过感伤迷惘不管是平静与匆忙 苦闷或欢畅总有份期盼在我的身旁时光不停流逝会让我疯狂也让我更坚强  之前写过两篇关于Android中模拟用户操作的博客(其实用一篇是转载的),现在就来讲讲用shell脚本来模拟用户按键操作。本次的目标是用shell脚本打开微信并在其搜索框中搜索相关内容。
  本文的模拟功能主要是用adb的input命令来实现,如果你adb的环境变量配置正确的话,在cmd中输入&adb shell input&就可以看见input的用法了。
usage: input ...
input text //输入文字(中文不支持)
input keyevent //keyevent按键
input [touchscreen|touchpad|touchnavigation] tap &x& &y&//点击屏幕
input [touchscreen|touchpad|touchnavigation] swipe &x1& &y1& &x2& &y2& //屏幕滑动
input trackball press //滚球已经不用了
input trackball roll //滚球已经不用了
input rotationevent 0 1-&90 2-&180 3-&270& //顺时针旋转
下面直接上安卓用户操作的代码,就一个MainActivity而已,UI、Mainfest都不用配置(可能需要root权限)
1 package com.lsj.
3 import java.io.DataOutputS
5 import android.app.A
6 import android.os.B
7 import android.view.M
9 public class MainActivity extends Activity {
private String[] search = {
"input keyevent 3",// 返回到主界面,数值与按键的对应关系可查阅KeyEvent
"sleep 1",// 等待1秒
"am start -n com.tencent.mm/com.tencent.mm.ui.LauncherUI",// 打开微信的启动界面,am命令的用法可自行百度、Google
"sleep 3",// 等待3秒
"am start -n com.tencent.mm/com.tencent.mm.plugin.search.ui.SearchUI",// 打开微信的搜索
"input text 123",// 像搜索框中输入123,但是input不支持中文,蛋疼,而且这边没做输入法处理,默认会自动弹出输入法
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//如果input text中有中文,可以将中文转成unicode进行input,没有测试,只是觉得这个思路是可行的
search[5] = chineseToUnicode(search[5]);
execShell(search);
* 执行Shell命令
* @param commands
要执行的命令数组
public void execShell(String[] commands) {
// 获取Runtime对象
Runtime runtime = Runtime.getRuntime();
DataOutputStream os = null;
// 获取root权限,这里大量申请root权限会导致应用卡死,可以把Runtime和Process放在Application中初始化
Process process = runtime.exec("su");
os = new DataOutputStream(process.getOutputStream());
for (String command : commands) {
if (command == null) {
// donnot use os.writeBytes(commmand), avoid chinese charset
os.write(command.getBytes());
os.writeBytes("\n");
os.flush();
os.writeBytes("exit\n");
os.flush();
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
* 把中文转成Unicode码
* @param str
public String chineseToUnicode(String str){
String result="";
for (int i = 0; i & str.length(); i++){
int chr1 = (char) str.charAt(i);
if(chr1&=19968&&chr1&=171941){//汉字范围 \u4e00-\u9fa5 (中文)
result+="\\u" + Integer.toHexString(chr1);
result+=str.charAt(i);
* 判断是否为中文字符
* @param c
boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
return true;
return false;
  模拟用户打开微信,并进行搜索就这么完成了。其实这里用shell命令模拟用户操作还是有些问题的,比如说控件长按(sendevent),好难理解,而且需要跟其中传递的控件坐标参数应该要跟屏幕分辨率联系起来,实际应用范围不是很广泛。PS:那种大量需要重复操作的除外,如:自动化测试,游戏刷图(PS:腾讯的仙剑手游把我大仙剑毁了啊,麻花腾你妹啊,你全家都是麻花腾)。
  最后,其实可以参考下按键精灵,这款应用做的还不错,除了不给root权限就崩外....
补充:以上模拟用户操作的代码在交互不频繁的情况下是完全没有问题的,但是如果使用频繁的话,会发生多次申请root权限,导致系统卡死的现象,后面在google上找到了一个,可以解决这个问题(它使用的是单例模式),代码如下:
* 类名 RootContext.java 说明 获取root权限 创建日期
作者 LiWenLong Email
更新时间 $Date$ 最后更新者 $Author$
5 public class RootContext {
private static RootContext instance = null;
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)
return true;
} catch (Exception e) {
return false;
* 以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();
exec = null;
作者:登天路
转载请说明出处:
阅读(...) 评论()按键精灵9循环脚本中怎么处理另外的触发事件?_按键精灵吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:387,419贴子:
按键精灵9循环脚本中怎么处理另外的触发事件?收藏
新手,想写个小3D游戏的自动收魂脚本玩。
一根筋教育,毕业季超值福利免费送
加判断,if
如果有稍微具体点的更好
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或}

我要回帖

更多关于 按键精灵点击屏幕脚本 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信