精华内容
下载资源
问答
  • 如果采用手动点击按钮,效率不高,在领导提示下使用按键精灵实现自动操作。 一. 安卓手机按键精灵APP录制(免root版) 适用于安卓7及以下系统的手机 1. 手机从应用市场下载并安装按键精灵app; 2. 电脑安装...

       简单介绍下应用背景:测试安卓app时发现重复点击某一按钮的时候会出现报错,开发修复后提交测试。如果采用手动点击按钮,效率不高,在领导提示下使用按键精灵实现自动操作。

    一.       安卓手机按键精灵APP录制(免root版)

    适用于安卓7及以下系统的手机

    1. 手机从应用市场下载并安装按键精灵app;

    2. 电脑安装按键精灵手机助手;

    3.   在将手机连接USB前,请先找到开发者选项,打开“开发者选项”并勾选“USB调试”;

    4. 用数据线将手机连接电脑,连接后,电脑屏幕右下角会提示开始安装驱动,安装完后会出现提示成功安装。

    5. 电脑打开按键精灵手机助手,如果未识别设备,点击右上方“尚未连接到手机”,点击“重新扫描”,此时会搜索发现手机,选择开始连接

    添加上手机后,可以断开电脑的数据线,在app上进行操作了。

    6. 按键精灵手机助手与手机连接成功后,会显示手机型号,同时也说明手机已成功获取到root授权

    7. 手机成功获取root授权后,就可以在手机端按键精灵上进行点一点、录制或运行脚本等操作;

    8. 打开手机上的按键精灵app,选择“录制”选项,点击录制图标,打开选择应用页,选择要录制的app

    9.  点击保存的录制,可以进行循环设置,设置运行次数或者重复运行至手动停止

    10. 录制时按音量+号开始录制,音量-号停止录制。

    转载于:https://www.cnblogs.com/kongso/p/10537832.html

    展开全文
  • 我在实现安卓模拟点击屏幕固定位置时尝试了很多方法,碰了不少壁,现在我将我实现的方法分享给大家,以及我尝试过的方法也分享给大家,让大家在开发的路上少走些弯路。 首先我尝试用安卓辅助功能Accessibility...

             我在实现安卓模拟点击屏幕固定位置时尝试了很多方法,碰了不少壁,现在我将我实现的方法分享给大家,以及我尝试过的方法也分享给大家,让大家在开发的路上少走些弯路。

    首先我尝试用安卓辅助功能AccessibilityService类实现模拟屏幕点击,但是这个类只能找到页面的控件,然后对控件进行模拟点击,不能实现对屏幕的某个位置进行点击,这个方法失败后我就试了另一种Instrumentation方法,这种方法确实可以点击屏幕上任何位置,而且点击事件可以生效,但是退出程序就不能进行了,程序出现错误,提示没有INJECT_EVENTS权限,但是加入INJECT_EVENTS权限后,还是出错,查了一下资料,说可以在添加android:sharedUserId="android.uid.system"获取系统共享签名,但是加入后生成的APK无法安装的手机上。

    使用Instrumentation方法点击手机屏幕的任何位置

    import java.io.IOException;
     
    import android.app.Instrumentation;
    import android.os.SystemClock;
    import android.util.Log;
    import android.view.MotionEvent;
     
    public class ThreadClass extends Thread {
        private int x,y;
        //400,689
        @Override
        public void run() {
            while(true)
            {            
                //利用ProcessBuilder执行shell命令
                /*String[] order = {
                        "input",
                        "tap",
                        "" + x,
                        "" + y
                };
                Log.d("点击位置", x+","+y);
                try {
                    new ProcessBuilder(order).start();
                } catch (IOException e) {
                    e.printStackTrace();
                }*/
                // 可以不用在 Activity 中增加任何处理,各 Activity 都可以响应 
                 try {  
                    Instrumentation inst = new Instrumentation();  
                    inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),   
                        MotionEvent.ACTION_DOWN, x, y, 0));  
                    inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),   
                        MotionEvent.ACTION_UP, x, y, 0));
                    Log.d("点击位置", x+","+y);
                 }catch(Exception e) {  
                     Log.e("Exception when sendPointerSync", e.toString());  
                 }  
                //线程睡眠3s
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
     
        }
        public ThreadClass(int x,int y){
            this.x=x;
            this.y=y;
        }
    }


    其中x,y是需要点击的屏幕左边,以左上角为原点的直角坐标系统
    加入INJECT_EVENTS权限

    <uses-permission android:name="android.permission.INJECT_EVENTS"/>
    添加android:sharedUserId="android.uid.system"位置如下,写安卓的应该都可以明白

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.clickservice"
        android:versionCode="1"
        android:versionName="1.0" 
        android:sharedUserId="android.uid.system"
        >

            为了解决这个错误,我按照网上说的方法进行,使用安卓签名工具SignApk.jar对编译的apk进行签名,签名后的APK还是无法安装在手机上,还有一种解决这问题的方法就是使用android源码编译,相信这种方法会让大多数人无从下手,光将android源码编译的环境搭配起来都不是一件容易的事,有兴趣的可以尝试一下这种方法,下面就步入我们今天要讲的主题adb shell。
    首先我们在windows下通过adb shell控制手机,在此之前,保证你的手机已经连接电脑,进入eclipse adt开发环境下的adb所在文件目录,以我的为例,路径为..\adt-bundle-windows-x86-20130917\sdk\platform-tools,以下是我的目录截图,可以对着找到该目录。


            在该目录下,按下shift键后点击鼠标右键,在弹出窗口中选择“在此处打开命令窗口(W)”,也可以直接cmd进入这目录,在命令窗口输入:adb shell 进入adb shell命令状态,此后就可以用shell命令控制你的手机了。

    我在此就简单介绍一些命令,要想详细了解的去下面两篇博客

    自己动手开发精简版按键精灵

    Android模拟屏幕点击事件

    getevent -p 
    查看哪个设备包含event 体系里 宽(0035)和高(0036),那么这个设备就是我们的安卓手机,例如这里的设备名称为/dev/input/event1


    模拟发送事件
    getevent/sendevent是Android系统下的一个工具,可以模拟多种按键和触屏操作,产生的是raw event,raw event经过event hub处理产生最终的gesture事件。getevent用于获取当前系统input设备的一些参数和实时事件的数据;sendevent用于发送input事件,这俩命令的作用就是相当于解放了手,可以通过命令直接调用Linux底层来控制手机,工具的源码位于Android SDK的system/core/toolbox下(sendevent.c getevent.c)。

    发送键盘事件 
    用法说明: 
    adb shell input keyevent “value” 
    input text 
    input keyevent 
    input tap 
    input swipe 
    如上,input后可以跟很多参数, text相当于输入内容,keyevent相当于手机物理或是屏幕按键,tap相当于touch事件,swipe相当于滑动~~是不是很赞?先列举 input keyevent 几个比较常用的code值: 
    input keyevent 3 // Home 
    input keyevent 4 // Back 
    input keyevent 19 //Up 
    input keyevent 20 //Down 
    input keyevent 21 //Left 
    input keyevent 22 //Right 
    input keyevent 23 //Select/Ok 
    input keyevent 24 //Volume+ 
    input keyevent 25 // Volume- 
    input keyevent 82 // Menu 菜单

    附:input keyevent所对应全部key值:

    KeyCode Keyevent Value

    KEYCODE_MENU 1 
    KEYCODE_SOFT_RIGHT 2 
    KEYCODE_HOME 3 
    KEYCODE_BACK 4 
    KEYCODE_CALL 5 
    KEYCODE_ENDCALL 6 
    KEYCODE_0 7 
    KEYCODE_1 8 
    KEYCODE_2 9 
    KEYCODE_3 10 
    KEYCODE_4 11 
    KEYCODE_5 12 
    KEYCODE_6 13 
    KEYCODE_7 14 
    KEYCODE_8 15 
    KEYCODE_9 16 
    KEYCODE_STAR 17 
    KEYCODE_POUND 18 
    KEYCODE_DPAD_UP 19 
    KEYCODE_DPAD_DOWN 20 
    KEYCODE_DPAD_LEFT 21 
    KEYCODE_DPAD_RIGHT 22 
    KEYCODE_DPAD_CENTER 23 
    KEYCODE_VOLUME_UP 24 
    KEYCODE_VOLUME_DOWN 25 
    KEYCODE_POWER 26 
    KEYCODE_CAMERA 27 
    KEYCODE_CLEAR 28 
    KEYCODE_A 29 
    KEYCODE_B 30 
    KEYCODE_C 31 
    KEYCODE_D 32 
    KEYCODE_E 33 
    KEYCODE_F 34 
    KEYCODE_G 35 
    KEYCODE_H 36 
    KEYCODE_I 37 
    KEYCODE_J 38 
    KEYCODE_K 39 
    KEYCODE_L 40 
    KEYCODE_M 41 
    KEYCODE_N 42 
    KEYCODE_O 43 
    KEYCODE_P 44 
    KEYCODE_Q 45 
    KEYCODE_R 46 
    KEYCODE_S 47 
    KEYCODE_T 48 
    KEYCODE_U 49 
    KEYCODE_V 50 
    KEYCODE_W 51 
    KEYCODE_X 52 
    KEYCODE_Y 53 
    KEYCODE_Z 54 
    KEYCODE_COMMA 55 
    KEYCODE_PERIOD 56 
    KEYCODE_ALT_LEFT 57 
    KEYCODE_ALT_RIGHT 58 
    KEYCODE_SHIFT_LEFT 59 
    KEYCODE_SHIFT_RIGHT 60 
    KEYCODE_TAB 61 
    KEYCODE_SPACE 62 
    KEYCODE_SYM 63 
    KEYCODE_EXPLORER 64 
    KEYCODE_ENVELOPE 65 
    KEYCODE_ENTER 66 
    KEYCODE_DEL 67 
    KEYCODE_GRAVE 68 
    KEYCODE_MINUS 69 
    KEYCODE_EQUALS 70 
    KEYCODE_LEFT_BRACKET 71 
    KEYCODE_RIGHT_BRACKET 72 
    KEYCODE_BACKSLASH 73 
    KEYCODE_SEMICOLON 74 
    KEYCODE_APOSTROPHE 75 
    KEYCODE_SLASH 76 
    KEYCODE_AT 77 
    KEYCODE_NUM 78 
    KEYCODE_HEADSETHOOK 79 
    KEYCODE_FOCUS 80 
    KEYCODE_PLUS 81 
    KEYCODE_MENU 82 
    KEYCODE_NOTIFICATION 83 
    KEYCODE_SEARCH 84 
    TAG_LAST_KEYCODE 85

    通过以上的介绍你应该对adb shell命令有所了解了吧,但是如何用代码来实现呢,以下就是代码执行shell命令

    /** 
     * 执行shell命令 
     *  
     * @param cmd 
     */  
    private void execShellCmd(String cmd) {  
      
        try {  
            // 申请获取root权限,这一步很重要,不然会没有作用  
            Process process = Runtime.getRuntime().exec("su");  
            // 获取输出流  
            OutputStream outputStream = process.getOutputStream();  
            DataOutputStream dataOutputStream = new DataOutputStream(  
                    outputStream);  
            dataOutputStream.writeBytes(cmd);  
            dataOutputStream.flush();  
            dataOutputStream.close();  
            outputStream.close();  
        } catch (Throwable t) {  
            t.printStackTrace();  
        }  
    } 

     

    在想要执行的地方调用上面函数:
    execShellCmd("getevent -p");  
    execShellCmd("sendevent /dev/input/event1 1 158 1");  
    execShellCmd("sendevent /dev/input/event1 1 158 0");  
    execShellCmd("input keyevent 3");//home  
    execShellCmd("input text  'helloworld!' ");  
    execShellCmd("input tap 168 252");  
    execShellCmd("input swipe 100 250 200 280");  

    注意使用sendevent执行事件时,可以看到sendevent需要4个参数即:device,type,code,value。这些值可以由input子系统定义,也可以从getevent里面获取。type其实就是和getevent中的支持事件类型所对应的, value=1是按下,value=0是弹起,也就是说只有当两个命令同时执行时命令才会生效,也就是下面两句要先后一并执行
    execShellCmd("sendevent /dev/input/event1 1 158 1");  
    execShellCmd("sendevent /dev/input/event1 1 158 0"); 

    如果要退出程序后,继续执行模拟点击屏幕,只要写一个后台运行的Service挂在后台运行即可,到此模拟点击手机屏幕的功能就实现了。因为写这篇文章的时候,经验不足,请大家多多指教

     

    本文章对应程序,实现按键精灵模拟点击源码:http://download.csdn.net/download/yuanhengzhw/10254876

    展开全文
  • 有些游戏直接用au3里面的模拟点击/按键都是无效的,包括qq2007也是无法实现,下面是一个解决方法,具体实现方法(vb的),想改成au3的,还没成功,有兴趣的朋友也来试试.驱动级模拟 如果上面的方法你都试过了,可是你发现...


    有些游戏直接用au3里面的模拟点击/按键都是无效的,包括qq2007也是无法实现,下面是一个解决方法,具体实现方法(vb的),想改成au3的,还没成功,有兴趣的朋友也来试试.
    驱动级模拟

         如果上面的方法你都试过了,可是你发现目标程序却仍然顽固的不接受你模拟的消息,寒~~~~~~~~~还好,我还剩下最后一招,这就是驱动级模拟:直接读写键盘的硬件端口!
         有一些使用DirectX接口的游戏程序,它们在读取键盘操作时绕过了windows的消息机制,而使用DirectInput.这是因为有些游戏对实时性控制的要求比较高,比如赛车游戏,要求以最快速度响应键盘输入。而windows消息由于是队列形式的,消息在传递时会有不少延迟,有时1秒钟也就传递十几条消息,这个速度达不到游戏的要求。而DirectInput则绕过了windows消息,直接与键盘驱动程序打交道,效率当然提高了不少。因此也就造成,对这样的程序无论用PostMessage或者是keybd_event都不会有反应,因为这些函数都在较高层。对于这样的程序,只好用直接读写键盘端口的方法来模拟硬件事件了。要用这个方法来模拟键盘,需要先了解一下键盘编程的相关知识。
         在DOS时代,当用户按下或者放开一个键时,就会产生一个键盘中断(如果键盘中断是允许的),这样程序会跳转到BIOS中的键盘中断处理程序去执行。打开windows的设备管理器,可以查看到键盘控制器由两个端口控制。其中&H60是数据端口,可以读出键盘数据,而&H64是控制端口,用来发出控制信号。也就是,从&H60号端口可以读此键盘的按键信息,当从这个端口读取一个字节,该字节的低7位就是按键的扫描码,而高1位则表示是按下键还是释放键。当按下键时,最高位为0,称为通码,当释放键时,最高位为1,称为断码。既然从这个端口读数据可以获得按键信息,那么向这个端口写入数据就可以模拟按键了!用过QbASIC4.5的朋友可能知道,QB中有个OUT命令可以向指定端口写入数据,而INP函数可以读取指定端口的数据。那我们先看看如果用QB该怎么写代码:
    假如你想模拟按下一个键,这个键的扫描码为&H50,那就这样
    OUT &H64,&HD2    '把数据&HD2发送到&H64端口。这是一个KBC指令,表示将要向键盘写入数据
    OUT &H60,&H50    '把扫描码&H50发送到&H60端口,表示模拟按下扫描码为&H50的这个键
    那么要释放这个键呢?像这样,发送该键的断码:
    OUT &H64,&HD2    '把数据&HD2发送到&H64端口。这是一个KBC指令,表示将要向键盘写入数据
    OUT &H60,(&H50 OR &H80)    '把扫描码&H50与数据&H80进行或运算,可以把它的高位置1,得到断码,表示释放这个键
    2007-4-19 02:08 wyh1983
    好了,现在的问题就是在VB中如何向端口写入数据了。因为在windows中,普通应用程序是无权操作端口的,于是我们就需要一个驱动程序来帮助我们实现。在这里我们可以使用一个组件WINIO来完成读写端口操作。什么是WINIO?WINIO是一个全免费的、无需注册的、含源程序的WINDOWS2000端口操作驱动程序组件(可以到http://www.internals.com/上去下载)。它不仅可以操作端口,还可以操作内存;不仅能在VB下用,还可以在DELPHI、VC等其它环境下使用,性能特别优异。下载该组件,解压缩后可以看到几个文件夹,其中Release文件夹下的3个文件就是我们需要的,这3个文件是WinIo.sys(用于win xp下的驱动程序),WINIO.VXD(用于win 98下的驱动程序),WinIo.dll(封装函数的动态链接库),我们只需要调用WinIo.dll中的函数,然后WinIo.dll就会安装并调用驱动程序来完成相应的功能。值得一提的是这个组件完全是绿色的,无需安装,你只需要把这3个文件复制到与你的程序相同的文件夹下就可以使用了。用法很简单,先用里面的InitializeWinIo函数安装驱动程序,然后就可以用GetPortVal来读取端口或者用SetPortVal来写入端口了。好,让我们来做一个驱动级的键盘模拟吧。先把winio的3个文件拷贝到你的程序的文件夹下,然后在VB中新建一个工程,添加一个模块,在模块中加入下面的winio函数声明eclare Function MapPhysToLin Lib 'WinIo.dll' (ByVal PhysAddr As Long, ByVal PhysSize As Long, ByRef PhysMemHandle) As Long
    Declare Function UnmapPhysicalMemory Lib 'WinIo.dll' (ByVal PhysMemHandle, ByVal LinAddr) As Boolean
    Declare Function GetPhysLong Lib 'WinIo.dll' (ByVal PhysAddr As Long, ByRef PhysVal As Long) As Boolean
    Declare Function SetPhysLong Lib 'WinIo.dll' (ByVal PhysAddr As Long, ByVal PhysVal As Long) As Boolean
    Declare Function GetPortVal Lib 'WinIo.dll' (ByVal PortAddr As Integer, ByRef PortVal As Long, ByVal bSize As Byte) As Boolean
    Declare Function SetPortVal Lib 'WinIo.dll' (ByVal PortAddr As Integer, ByVal PortVal As Long, ByVal bSize As Byte) As Boolean
    Declare Function InitializeWinIo Lib 'WinIo.dll' () As Boolean
    Declare Function ShutdownWinIo Lib 'WinIo.dll' () As Boolean
    Declare Function InstallWinIoDriver Lib 'WinIo.dll' (ByVal DriverPath As String, ByVal Mode As Integer) As Boolean
    Declare Function RemoveWinIoDriver Lib 'WinIo.dll' () As Boolean
    ' ------------------------------------以上是WINIO函数声明-------------------------------------------
    Declare Function MapVirtualKey Lib 'user32' Alias 'MapVirtualKeyA' (ByVal wCode As Long, ByVal wMapType As Long) As Long
    '-----------------------------------以上是WIN32 API函数声明-----------------------------------------
    再添加下面这个过程:
    Sub KBCWait4IBE()    '等待键盘缓冲区为空
    Dim dwVal As Long
       Do
       GetPortVal &H64, dwVal, 1
    '这句表示从&H64端口读取一个字节并把读出的数据放到变量dwVal中
    'GetPortVal函数的用法是GetPortVal 端口号,存放读出数据的变量,读入的长度
       Loop While (dwVal And &H2)
    End Sub
    上面的是一个根据KBC规范写的过程,它的作用是在向键盘端口写入数据前等待一段时间,后面将会用到。
    然后再添加如下过程,这2个过程用来模拟按键:
    Public Const KBC_KEY_CMD = &H64     '键盘命令端口
    Public Const KBC_KEY_DATA = &H60    '键盘数据端口
    Sub MyKeyDown(ByVal vKeyCoad As Long)  
    '这个用来模拟按下键,参数vKeyCoad传入按键的虚拟码
    Dim btScancode As Long
    btScancode = MapVirtualKey(vKeyCoad, 0)
     
         KBCWait4IBE    '发送数据前应该先等待键盘缓冲区为空
         SetPortVal KBC_KEY_CMD, &HD2, 1      '发送键盘写入命令
    'SetPortVal函数用于向端口写入数据,它的用法是SetPortVal 端口号,欲写入的数据,写入数据的长度
         KBCWait4IBE
         SetPortVal KBC_KEY_DATA, btScancode, 1   '写入按键信息,按下键
       
    End Sub
    Sub MyKeyUp(ByVal vKeyCoad As Long)  
    '这个用来模拟释放键,参数vKeyCoad传入按键的虚拟码
    Dim btScancode As Long
    btScancode = MapVirtualKey(vKeyCoad, 0)
     
         KBCWait4IBE    '等待键盘缓冲区为空
         SetPortVal KBC_KEY_CMD, &HD2, 1   '发送键盘写入命令
         KBCWait4IBE
         SetPortVal KBC_KEY_DATA, (btScancode Or &H80), 1   '写入按键信息,释放键
    End Sub

    定义了上面的过程后,就可以用它来模拟键盘输入了。在窗体模块中添加一个定时器控件,然后加入以下代码:

    Private Sub Form_Load()
    If InitializeWinIo = False Then  
       '用InitializeWinIo函数加载驱动程序,如果成功会返回true,否则返回false
         MsgBox '驱动程序加载失败!'
         Unload Me
    End If
    Timer1.Interval=3000
    Timer1.Enabled=True
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
    ShutdownWinIo '程序结束时记得用ShutdownWinIo函数卸载驱动程序
    End Sub
    Private Sub Timer1_Timer()
    Dim VK_A as Long = &H41
    MyKeyDown VK_A   
    MyKeyUp VK_A     '模拟按下并释放A键
    End Sub
    [/quote]
    运行上面的程序,就会每隔3秒钟模拟按下一次A键,试试看,怎么样,是不是对所有程序都有效果了?
    需要注意的问题:
    要在VB的调试模式下使用WINIO,需要把那3个文件拷贝到VB的安装目录中。
    键盘上有些键属于扩展键(比如键盘上的方向键就是扩展键),对于扩展键不应该用上面的MyKeyDown和MyKeyUp过程来模拟,可以使用下面的2个过程来准确模拟扩展键:

    QUOTE:
    Sub MyKeyDownEx(ByVal vKeyCoad As Long)    '模拟扩展键按下,参数vKeyCoad是扩展键的虚拟码
    Dim btScancode As Long
    btScancode = MapVirtualKey(vKeyCoad, 0)
         KBCWait4IBE    '等待键盘缓冲区为空
         SetPortVal KBC_KEY_CMD, &HD2, 1      '发送键盘写入命令
         KBCWait4IBE
         SetPortVal KBC_KEY_DATA, &HE0, 1   '写入扩展键标志信息
       
       
         KBCWait4IBE    '等待键盘缓冲区为空
         SetPortVal KBC_KEY_CMD, &HD2, 1      '发送键盘写入命令
         KBCWait4IBE
         SetPortVal KBC_KEY_DATA, btScancode, 1   '写入按键信息,按下键
       
       
    End Sub

    Sub MyKeyUpEx(ByVal vKeyCoad As Long)    '模拟扩展键弹起
    Dim btScancode As Long
    btScancode = MapVirtualKey(vKeyCoad, 0)
         KBCWait4IBE    '等待键盘缓冲区为空
         SetPortVal KBC_KEY_CMD, &HD2, 1      '发送键盘写入命令
         KBCWait4IBE
         SetPortVal KBC_KEY_DATA, &HE0, 1   '写入扩展键标志信息
       
       
         KBCWait4IBE    '等待键盘缓冲区为空
         SetPortVal KBC_KEY_CMD, &HD2, 1      '发送键盘写入命令
         KBCWait4IBE
         SetPortVal KBC_KEY_DATA, (btScancode Or &H80), 1   '写入按键信息,释放键
       
    End Sub
    还应该注意的是,如果要从扩展键转换到普通键,那么普通键的KeyDown事件应该发送两次。也就是说,如果我想模拟先按下一个扩展键,再按下一个普通键,那么就应该向端口发送两次该普通键被按下的信息。比如,我想模拟先按下左方向键,再按下空格键这个事件,由于左方向键是扩展键,空格键是普通键,那么流程就应该是这样的:
    [quote]MyKeyDownEx VK_LEFT    '按下左方向键
    Sleep 200              '延时200毫秒
    MyKeyUpEx VK_LEFT      '释放左方向键
    Sleep 500
    MyKeyDown VK_SPACE    '按下空格键,注意要发送两次
    MyKeyDown VK_SPACE
    Sleep 200
    MyKeyUp VK_SPACE      '释放空格键


    好了,相信到这里,你的模拟按键程序也就差不多了,测试一下,是不是很有效呢,嘿嘿~~~~
    WINIO组件的下载地址(官方):http://www.internals.com/utilities/winio.zip

    转载于:https://www.cnblogs.com/zhaoshujie/archive/2008/10/06/9594829.html

    展开全文
  • 我们知道,手机连接电脑,在电脑上输入adb命令是可以实现安装应用、卸载应用、monkey等事件的,甚至可以指定点击屏幕某点、或者操作某按键的行为。在android应用里,也可以执行adb命令,因此,这些操作是可以不借助...

    最近因为工作需要,需要实现某一应用自动操作android手机的业务场景。网上查了下,发现按键精灵早就有了Android版本,于是研究了下它。

    我们知道,手机连接电脑,在电脑上输入adb命令是可以实现安装应用、卸载应用、monkey等事件的,甚至可以指定点击屏幕某点、或者操作某按键的行为。在android应用里,也可以执行adb命令,因此,这些操作是可以不借助电脑、直接在某一android应用里实现的。

    按键精灵就是通过该技术实现的。

    Android上执行adb命令

    首先,应用执行adb命令需要先进入su账户;而进入su账户,需要手机已被完全root过。类似于在PC上adb shell之后的su(超级管理员)。

    获取root权限

    /**
     * 应用程序运行命令获取 Root权限,设备必须已破解(已Root过,获得ROOT权限)
     * @return 应用程序是/否获取Root权限
     */
    public static boolean getRootAhth() {
        OutputStream os = null;
        try {
            //请求进入su账户,类似PC端adb shell之后的su命令。同时,获取与之相关的输出流
            os = Runtime.getRuntime().exec("su").getOutputStream();
            //退出su
            os.write(("exit\n").getBytes());
            os.flush();
            //上述命令执行成功,则进入su账户成功,具备进入su的能力,说明已经获取到了root权限
            return true;
        } catch (Exception e) {
            System.out.println("adb命令执行失败,错误原因:" + e.getMessage());
            return false;
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
            } catch (Exception e) {
            }
        }
    }

    如果之前没为应用分配root权限,到系统里为它分配root权限。以小米手机(MIUI系统)为例,到“安全中心”–“授权管理”–“ROOT权限管理”中,找到你自己的应用,为它分配root权限。

    执行adb命令

    /**执行adb命令,需要已经为应用分配过root权限
     * @param adbCommand
     */
    public static void execAdb(String adbCommand) {
        //简单有效,直接执行三条条adb命令
    //      try {
    //          Runtime.getRuntime().exec("su");
    //          Runtime.getRuntime().exec(adbCommand);
    //          Runtime.getRuntime().exec("exit\n");
    //      } catch (Exception e1) {
    //          e1.printStackTrace();
    //      }
    
        //或者用下面方式
        OutputStream os = null;
        try {
            //获取与之相关的输出流
            os =  Runtime.getRuntime().exec("su").getOutputStream();
            os.write(adbCommand.getBytes());
            //退出su
            os.write(("exit\n").getBytes());
            os.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
            } catch (Exception e) {
            }
        }
    }

    adb命令执行注意点

    获取执行命令所需的OutputStream 需要以链式调用的方式来获取,分两行写的非链式调用会导致部分命令不生效。
    有效写法:

    os =  Runtime.getRuntime().exec("su").getOutputStream();

    无效写法:

    process = Runtime.getRuntime().exec("su");
    os = process.getOutputStream();

    常用adb命令总结

    //在IO流中输入命令,需要加"\n",因为见到回车才会执行命令;
    //如果直接用Runtime.getRuntime().exec(adbCommand)来执行,则不必加回车符;
    
    //点击屏幕上的一点,eg:这点的像素坐标是(100,100)
    public String AdbTap = "input tap 100 100\n";
    /**
     * 实现滑动操作,前两个参数是开始坐标,接下来两个是终点坐标,最后一个是持续时间。
     * 解释参考:http://blog.csdn.net/u012912435/article/details/51483309
     * 可以用来模拟长按,原理:在小的距离内,在较长的持续时间内进行滑动,最后表现出来的结果就是长按动作。
     */
    public String AdbSwipe = "input swipe 500 500 501 501 2000\n";
    //按下按键,eg:该按键的按键值是4(系统的返回键)。按键值参考https://www.cnblogs.com/sharecenter/p/5621048.html
    public String AdbKeyevent = "input keyevent 4\n";
    //输入文本,eg:文本内容是1234567890
    public String AdbText = "input text 1234567890\n";

    发散思维

    安卓版按键精灵的实现原理就是通过adb命令来实现自动操作的,如有兴趣,可以自己尝试开发一下,可以参考:
    http://blog.csdn.net/yuanhengzhw/article/details/70435626
    http://blog.csdn.net/ithouse/article/details/50854539

    另外,我们还可以单纯的用”input keyevent keycode”命令来实现一款安卓版手机输入法,当然很不实用就是了,因为adb命令的执行是需要时间的,这种方式开发出来的输入法必定交互很差。而且,输入法有专门相关的类,这个类叫InputMethodService,可以参考:
    http://blog.csdn.net/mfzabc/article/details/54894875
    感兴趣的也可以自己实现一下。

    展开全文
  • 如果采用手动点击按钮,效率不高,在领导提示下使用按键精灵实现自动操作。 一. 安卓手机按键精灵APP录制(免root版) 适用于安卓7及以下系统的手机 1. 手机从应用市场下载并安装按键精灵app; 2. 电脑安装...
  • 按键安卓注册码系统自动发卡功能流程  本次免费版注册码系统支持全自动发卡功能,下载安装应用后可直接自动生卡售卡结算,无需人工操作。这样作者们只要接入自己的脚本就可以先有收入来源,然后再根据用户自己的...
  • Android系统之路(初识MTK) ------ Default Voice Control/输入法校准、自动校准、首字母大写、按键声音
  • iOS 自动化测试 AirTest+wdaproxy(或按键精灵?!) iOS自动化测试的方案有很多,但是很多都要依赖mac电脑。毕竟apple最了解apple 配置airtest环境 前提条件:安装Xcode,拥有Apple Id(用于临时调试,生成临时的...
  • linux下的autorepeat(按键自动重复)

    千次阅读 2010-11-29 23:22:00
    X11下按下一个键,会自动重复,比如按下A键不放,系统会产生一连串的a press, a release, a press, a release事件,其实这个是可以设置的: xset -r r off关闭自动重复。  
  • Android黑科技 自动点击

    千次阅读 2020-03-26 15:28:44
    Android 模拟点击功能
  • 按键和中断

    千次阅读 2016-09-10 13:20:05
    按键
  • delphi XE模拟Android手机设备的虚拟键盘按键 一、直接上代码示例 procedure TfmxTestGYListview1.FormKeyUp( Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); var CanUse: ...
  • 需求在 A 界面,点击跳转到 B 界面(该界面会执行一些业务),再点击返回...在搜索资料过程中了解到还可以使用 adb 来实现模拟设备操作,那肯定是写代码更顺手啊,配合使用脚本重复输入命令,就能实现简单的自动化重复
  • 一、应用中模拟物理和屏幕点击事件 例如,模拟对某个view的点击事件 private void simulateClick(View view, float x, float y) { long downTime = SystemClock.uptimeMillis(); final MotionEvent downEvent =...
  • 自己动手开发安卓版按键精灵

    万次阅读 2016-03-11 11:20:32
    获取(并记录)点击的位置1.找出我们的安卓设备名称 adb shell getevent -p 查看哪个设备包含event 体系里 宽(0035)和高(0036),那么这个设备就是我们的安卓手机,例如这里的设备名称为/dev/input/event8 ...
  • 1.点击 快速点击 click(self) 调用对象需是UiObject eg. driver.find_element_by_xx.click() 单指或多指点击,长按 tap(self,[(x0,y0),…],duration=None) 最多可模拟五个手指同时点击,duration单位ms 2.滑动 swipe...
  • 由于目前市面上能找到的模拟触摸库都只支持到iOS11,而主流的iOS版本已经到了13,于是自己写了一个模拟触摸、模拟点击的库,支持iOS11 - 13.6 Github链接:https://github.com/xuan32546/IOS13-SimulateTouch 简介 ...
  • 安卓虚拟按键隐藏

    千次阅读 2018-06-09 14:00:26
    转自:https://www.jianshu.com/p/e27e7f09d1f7概述系统栏是专注于显示通知,设备状态的通信和设备导航的屏幕区域。典型的系统栏(由状态栏和导航栏组成,如下图)与应用程序同时显示。应用程序显示沉浸式的内容时,...
  • 类介绍 UiDevices代表设备状态 ... 操作:按键,坐标操作,滑动,拖动,唤醒,截图等 监听器 源码的介绍: /** * UiDevice provides access to state information about the device. ...
  • [620]使用Python实现一个按键精灵

    万次阅读 多人点赞 2019-06-11 23:32:20
    按键精灵想必很多人都玩过,使用录制功能将鼠标和键盘的操作录制下来,录制好后就可以通过回放自动执行之前录制的操作,可以设置重复执行的次数,这样就可以将一些重复的劳动交给脚本自动化去完成。使用Python编写一...
  • 1、复习裸机按键操作驱动 #define GPGCON (volatile unsigned long *)0x56000060 /* * K1,K2,K3,K4对应GPG0、GPG3、GPG5、GPG6 */ #define GPG0_int (0x2<<(0*2)) #define GPG3_int (0x2<<(3*2)) #...
  • Android按键事件传递流程

    千次阅读 2017-09-01 09:19:07
    做Android开发的少不了对触摸、按键事件...android输入设备支持鼠标、键盘(按键)、触摸屏(单点、多点)、轨迹球等,这些设备所产生的输入事件Input Event从底层驱动开始经过input子系统核心层到达Event Handler事件层
  • 按键精灵实现原理

    万次阅读 2016-07-09 20:54:56
    安卓使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵) 有 时我们需要使用安卓实现在后台模拟系统按键,比如对音量进行调节(模拟音量键),关闭前台正在运行的App(模拟返回键),或者模拟触屏事件...
  • JavaScript实现按键精灵

    千次阅读 2017-04-17 11:31:41
    最近有个需求,需要在页面上面自动点击、输入、提交。 用以模拟真实用户的操作行为,可以通过直接执行某个元素绑定的事件,来执行操作。 也可以创建事件,再派发事件,执行操作。关于事件的更多细节,可以参考...
  • 1.AccessibilityService辅助类,这个类是设计用来帮助残障人士使用android 手机的,我们可以利用它实现按键精灵的部分功能,因为利用这个类只能找到页面的控件,然后对控件进行模拟点击,不能实现对屏幕的某个位置...
  • android 4.4 按键分析三

    千次阅读 2014-10-11 12:21:57
    关于Android消息处理机制的全面分析,可参考另外的文档,这里着重介绍事件处理相关问题,作为按键处理的基础知识。     3.5.2 Looper的事件交付 Looper维护线程的消息队列,它将消息队列里面的消息分发出去,它有...
  • 手机自动化测试工具基本原理 一、首先说说手机自动化测试的原理 1、手机自动化测试的原理为PC上一个控制端(测试工具)与手机上的一个agent端,通过串口、USB或者无线方式将PC与手机终端相连,然后应用测试工具向...
  • 众所周知,按键精灵是一个模拟鼠标/键盘/手指动作的软件,通过制作脚本,可以让按键精灵代替双手,在电脑/手机端自动执行一系列鼠标键盘动作。Total Control是手机群控行业领先品牌,提供脚本API接口,完美支持按键...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,276
精华内容 6,910
关键字:

自动按键点击设备