悬浮菜单+虚拟按键

1.首先控制悬浮窗要用service

2.悬浮窗的参数


if (wm == null)
wm = (WindowManager) getApplicationContext().getSystemService("window");
if (ballWmParams == null) {
ballWmParams = new WindowManager.LayoutParams();// ((MyApplication)
// getApplication()).getMywmParams();
ballWmParams.type = WindowManager.LayoutParams.TYPE_PHONE;
ballWmParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
ballWmParams.gravity = Gravity.LEFT | Gravity.TOP;
ballWmParams.x = 50;
ballWmParams.y = 50;
ballWmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
ballWmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
ballWmParams.format = PixelFormat.RGBA_8888;
// 添加显示层
}
wm.addView(ballView, ballWmParams);



移除的时候要wm.removeViewImmediate(v);

3.LinearLayout的边框,用drawable类型的xml画出

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >

<gradient
android:angle="180"
android:centerX="5"
android:centerY="5"
android:endColor="#22080808"
android:gradientRadius="100"
android:startColor="#ddffffff"
android:type="radial" />

<stroke
android:dashWidth="2dp"
android:width="2dp"
android:color="#99ffffff" />

<corners android:radius="5dp" />
<!-- <solid android:color="#11ffffff" /> -->
<padding
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />

</shape>



---------------------------------------------虚拟按键

分为两种思路,一种是使用系统签名+反射机制,一种是root
前一种,如果有签名的很方便,后一种可以适用大多是机型。


1.反射方法调用按键,反射+签名+特殊权限+平台编译
<uses-permission android:name="android.permission.INJECT_EVENTS" />


void test() {

new Thread() {
public void run() {
KeyEvent keyEventDown = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
KeyEvent keyEventUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK);
final int repeatCount = (KeyEvent.FLAG_VIRTUAL_HARD_KEY & KeyEvent.FLAG_LONG_PRESS) != 0 ? 1 : 0;
final KeyEvent evDown = new KeyEvent(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK, repeatCount, 0, KeyCharacterMap.VIRTUAL_KEYBOARD,
0, KeyEvent.FLAG_VIRTUAL_HARD_KEY | KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY,
InputDevice.SOURCE_KEYBOARD);

final KeyEvent evUp = new KeyEvent(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK, repeatCount, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
KeyEvent.FLAG_VIRTUAL_HARD_KEY | KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY,
InputDevice.SOURCE_KEYBOARD);

Class<?> ClassInputManager;
try {
ClassInputManager = Class.forName("android.hardware.input.InputManager");
Method[] methods = ClassInputManager.getMethods();
System.out.println("cchen " + Arrays.toString(methods));
Method methodInjectInputEvent = null;
Method methodGetInstance = null;
for (Method method : methods) {
System.out.println("cchen " + method.getName());
if (method.getName().contains("getInstance")) {
methodGetInstance = method;
}
if (method.getName().contains("injectInputEvent")) {
methodInjectInputEvent = method;
}
}
Object instance = methodGetInstance.invoke(ClassInputManager, null);
boolean bool = InputManager.class.isInstance(instance);
System.out.println("cchen -- " + bool);
// methodInjectInputEvent =
// InputManager.getMethod("injectInputEvent",
// KeyEvent.class, Integer.class);
methodInjectInputEvent.invoke(instance, evDown, 0);
methodInjectInputEvent.invoke(instance, evUp, 0);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}



2.root方式

获得root权限,模拟在android机器上在shell中输入命令模拟按键

代码源于这里:
[url]http://leoly-fullnexus4.googlecode.com/svn/trunk/FullNexus4/[/url]

要导入其中的类库。


// String apkRoot="chmod 777 "+getPackageCodePath();
// RootCommand(apkRoot);
// full();

public static boolean RootCommand(String command) {
Process process = null;
DataOutputStream os = null;
try {
process = Runtime.getRuntime().exec("su");
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(command + "\n");
os.writeBytes("exit\n");
os.flush();
process.waitFor();
} catch (Exception e) {
Log.d("*** DEBUG ***", "ROOT REE" + e.getMessage());
return false;
} finally {
try {
if (os != null) {
os.close();
}
process.destroy();
} catch (Exception e) {
}
}
Log.d("*** DEBUG ***", "Root SUC ");
return true;
}

private void full() {
try {
InputShell localInputShell = getInputShell();
String str1 = "keycode " + KeyEvent.KEYCODE_BACK;
localInputShell.runCommand(str1);
} catch (Exception localException) {
String str2 = localException.getMessage();
Log.e("Button Savior", str2);
localException.printStackTrace();
}
}

public InputShell getInputShell() throws Exception {
String str1 = null;
InputStream localInputStream = null;
FileOutputStream localFileOutputStream = null;
byte[] arrayOfByte = new byte[4096];
InputShell localInputShell1 = this.mInputShell;
AssetManager localAssetManager;
File localFile;
int m;
if (localInputShell1 == null) {
localAssetManager = this.getApplicationContext().getResources().getAssets();
str1 = this.getApplicationContext().getFilesDir().getAbsolutePath();
int i = Build.VERSION.SDK_INT;
if (i > 15) {
Log.d("button", "using JB code");
String str2 = str1 + "/input2_jb.jar";
localFile = new File(str2);
str2 = "input2_jb.jar";
localInputStream = localAssetManager.open(str2);
} else if (i > 10 && i < 16) {
String str2 = str1 + "/input2_hc.jar";
localFile = new File((String) str2);
str2 = "input2_hc.jar";
localInputStream = localAssetManager.open(str2);
} else {
String str2 = str1 + "/input2.jar";
localFile = new File(str2);
str2 = "input2.jar";
localInputStream = localAssetManager.open(str2);
}

localFileOutputStream = new FileOutputStream(localFile);
m = localInputStream.read(arrayOfByte);
if (m == -1)
return null;
localFileOutputStream.write(arrayOfByte, 0, m);
localFileOutputStream.close();
localInputStream.close();
this.mInputShell = new InputShell("su", str1);
}
return this.mInputShell;
}





--------------------------------------------
整个源码上传到[url]http://download.youkuaiyun.com/detail/ccsosnfs/5790721[/url]
桌面悬浮菜单易语言源码 特色一: 全程渐变效果,透明度由高到低、由低到高,打开速度由快到慢,由慢加速,都是一个过程而非瞬间完成。 而且窗口的颜色,也是由渐变完成的。 特色二: 自定义列表,动态添加、程序,可添加任何目标。 特色三: 支持拖放,只需要把文件拖到这个悬浮窗上面,即可自动填写完毕添加向导,只需要点最后一步确定即可。 特色四: 可开启鼠标透过功能,把这个悬浮窗扔在一边,即使想要点某个点,而正巧那个点被悬浮窗覆盖时,悬浮窗将不会干扰你的操作,仍旧可以点的到!只有在鼠标停留在悬浮窗一段时间使菜单完全弹开以后,鼠标才不会透过悬浮窗。 特色五: 可以开机启动,点击右下角的那个小按钮,即可保持菜单处于一直张开的状态。 特色六: 即使是小白用户,也可以对那些霸屏的窗口开刀了。 正常隐藏时: 弹开后的菜单页: 鼠标透过判定修正:如果开启了鼠标透过,在窗口未完全打开时点击了菜单菜单会自动趋向关闭方向,不再理会停留在窗口上的鼠标,直到鼠标移开窗口后再移回来。 弹开后的工具页: 右下角三个按钮,从左到右依次是: 菜单页、工具页、最大化锁定。 左上角的十字瞄准线,拖动它就可以方便地在屏幕上取组件句柄。 点击"你给我消失"以后,目标窗口(必须是整个窗口)就会完全消失,仅在任务栏中有显示。而且无论怎么点击任务栏,窗口都不会出现,。此时列表框中会自动记录已消失的窗口,只有关闭那个窗口重新启动,或者从列表框中选中,点击"你可以回来了"放回来,那个窗口才会重新出现。 但是三次元封印,不会影响目标的运行情况。 一直留在最前可以设置某个窗口一直在最前面。 最前面没你事了 可以取消一个窗口的总在最前的属性,比如迅雷的悬浮框等。 注:切换到工具页后,会暂时取消本软件的自动鼠标透过,并且使用拖拽十字选中目标以后,最大化锁会自动锁上。 切换回菜单页,鼠标透过功能会自动恢复用户的设置。 源码看点: 1.API弹开菜单。 2.API开启鼠标透过。 3.API检测按键。 4.API打开通用对话框,功能和美观还有易用性上面,都超过易语言的通用对话框。 5.API实现单一实例。 6.API实现可调控式鼠标透过。 7.即使窗口总在最前,信息框仍旧不会被窗口遮挡。 8.API在屏幕上画矩形取目标句柄组件的边框。(新增) 9.让某窗口去三次旅游或者增加、取消其总在最前的属性。(新增)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值