最近项目需要在电视端虚拟一个鼠标,所以利用jni来做一个。

下面是虚拟鼠标控制的java代码

SimMouse.java

/**
 * native tool for browser
 */
public class SimMouse {
    //private static final String LOGTAG = "BrowserUtil";
    public static boolean mToolLibControlAble = true;
    //打开鼠标设备
    native public void openLinuxDevFd();
    //设置鼠标的位置
    native public void setmouse(short shift_X, short shift_Y);
    //关闭鼠标位置
    native public void closeLinuxDevFd();    
    //模拟鼠标点击事件
    native public void setmousekey(int mouseclick);    
    //模拟鼠标滚动事件
    native public void setmouseRel(int dir);

private static Context ctx;
    
   public void openInputDevice(){
        if(mToolLibControlAble)
        openLinuxDevFd();else{
            makeToastHint();
        }
   }

public void  mouseScroll(int dir){
         if(mToolLibControlAble)
         setmouseRel(dir);else{
             makeToastHint();
            }
   }
   
    public void  moveCursor(int x, int y) {
        if (mToolLibControlAble)
            setmouse((short)x,(short)y);else{
                makeToastHint();
            }
    }
    
    public void  mouseLeftClick() {
        if (mToolLibControlAble)
            setmousekey(0);else{
                makeToastHint();
            }
    }
    
    public void closeInputDevice() {
        if (mToolLibControlAble) {
            closeLinuxDevFd();
        }else{
            makeToastHint();
        }
    }
    public SimMouse(Context ctx) {
        SimMouse.ctx = ctx;
        try {
            System.loadLibrary("sim-mouse");
        } catch (UnsatisfiedLinkError ule) {
            makeToastHint();
            Log.e("BROWSERTOOL", "Could not load native library: libsimmouse");
            mToolLibControlAble = false;
            BrowserSettings settings = BrowserSettings.getInstance();
            settings.setVirtualMouse(false,false);
        }
    }
    public static void makeToastHint() {
        Toast.makeText(ctx, "载入 libsim-mouse库失败,虚拟鼠标失效", Toast.LENGTH_LONG).show();
    }

}

sim-mouse.h是自动生成的

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_tcl_browser_simmouse_SimMouse */

#ifndef _Included_com_tcl_browser_simmouse_SimMouse
#define _Included_com_tcl_browser_simmouse_SimMouse
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_tcl_browser_simmouse_SimMouse
 * Method:    openLinuxDevFd
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_tcl_browser_simmouse_SimMouse_openLinuxDevFd
  (JNIEnv *, jobject);

/*
 * Class:     com_tcl_browser_simmouse_SimMouse
 * Method:    setmouse
 * Signature: (SS)V
 */
JNIEXPORT void JNICALL Java_com_tcl_browser_simmouse_SimMouse_setmouse
  (JNIEnv *, jobject, jshort, jshort);

/*
 * Class:     com_tcl_browser_simmouse_SimMouse
 * Method:    closeLinuxDevFd
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_tcl_browser_simmouse_SimMouse_closeLinuxDevFd
  (JNIEnv *, jobject);

/*
 * Class:     com_tcl_browser_simmouse_SimMouse
 * Method:    setmousekey
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_com_tcl_browser_simmouse_SimMouse_setmousekey
  (JNIEnv *, jobject, jint);

/*
 * Class:     com_tcl_browser_simmouse_SimMouse
 * Method:    setmouseRel
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_com_tcl_browser_simmouse_SimMouse_setmouseRel
  (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif

这个才是关键代码

sim-mouse.cpp

#include <jni.h>
#include "sim-mouse.h"
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/input.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <jni.h>
#include <android/log.h>
extern "C" {
#define  LOG_TAG    "MouseControl"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)

FILE *fd_mouse = NULL;

struct InputEvent {
unsigned char type;//0 key 1 mounse
struct input_event event;
};
JNIEXPORT void JNICALL Java_com_tcl_browser_simmouse_SimMouse_setmouse
(JNIEnv *, jobject , jshort shift_X, jshort shift_Y)
{
    if(fd_mouse==NULL)
    {
        fd_mouse = fopen("/proc/motion/event", "w");
    }
    if(fd_mouse==NULL)
    {
        return;
    }
    struct InputEvent input_event;
            input_event.event.type = EV_REL;
            input_event.event.code = 0;
            input_event.event.value = shift_X;
            input_event.type = 1;
            if (fwrite(&input_event, sizeof(struct InputEvent), 1, fd_mouse) != 1)
            {

}
            fflush(fd_mouse);

input_event.event.type = EV_REL;
            input_event.event.code = 1;
            input_event.event.value = shift_Y;
            input_event.type = 1;
            if (fwrite(&input_event, sizeof(struct InputEvent), 1, fd_mouse) != 1)
            {

}
        fflush(fd_mouse);

}
JNIEXPORT void JNICALL Java_com_tcl_browser_simmouse_SimMouse_openLinuxDevFd
(JNIEnv *, jobject)
{

fd_mouse = fopen("/proc/motion/event", "w");
    if(fd_mouse==NULL) {
        return;
    }
}
 JNIEXPORT void JNICALL Java_com_tcl_browser_simmouse_SimMouse_closeLinuxDevFd
(JNIEnv *, jobject)
{
    if(fd_mouse != NULL)
    {
        fclose(fd_mouse);
    }
    fd_mouse = NULL;
}
JNIEXPORT void JNICALL Java_com_tcl_browser_simmouse_SimMouse_setmousekey
(JNIEnv *, jobject,jint mouseclick){
    if(fd_mouse==NULL)
    {
        fd_mouse = fopen("/proc/motion/event", "w");
    }
    if(fd_mouse==NULL)
    {
        return;
    }

//            LOGI("mouseclick: %d\n",mouseclick);
            if(mouseclick ==0){
                mouseclick = 0x110;
            }
            if(mouseclick == 1){
                mouseclick = 0x111;
            }
            struct InputEvent input_event;
                    input_event.event.type = EV_KEY;
                    input_event.event.code = mouseclick;
                    input_event.event.value = 1;
                    input_event.type = 1;
                    if (fwrite(&input_event, sizeof(struct InputEvent), 1, fd_mouse) != 1)
                    {

}
                    fflush(fd_mouse);
                    input_event.event.type = EV_KEY;
                    input_event.event.code = mouseclick;
                    input_event.event.value = 0;
                    input_event.type = 1;
                    if (fwrite(&input_event, sizeof(struct InputEvent), 1, fd_mouse) != 1)
                    {

}
                    fflush(fd_mouse);

}

JNIEXPORT void JNICALL Java_com_tcl_browser_simmouse_SimMouse_setmouseRel
(JNIEnv *, jobject ,jint value)
{
    if(fd_mouse==NULL)
    {
        fd_mouse = fopen("/proc/motion/event", "w");
    }
    if(fd_mouse==NULL)
    {
        return;
    }
    struct InputEvent input_event;
            input_event.event.type = EV_REL;
            input_event.event.code = 8;
            input_event.event.value = value;
            input_event.type = 1;
            if (fwrite(&input_event, sizeof(struct InputEvent), 1, fd_mouse) != 1)
            {

}
            fflush(fd_mouse);

}
}

linux/input.h 这个文件定义了event事件的结构体,API和标准按键的编码等; 
struct input_event { 
    struct timeval time;  //按键时间 
    __u16 type; //事件类型 
    __u16 code; //要模拟成什么按键 
    __s32 value;//是按下还是释放 
};

type,指事件类型,常见的事件类型有: 
EV_KEY, 按键事件,如键盘的按键(按下哪个键),鼠标的左键右键(是非击下)等; 
EV_REL, 相对坐标,主要是指鼠标的移动事件(相对位移); 
EV_ABS, 绝对坐标,主要指触摸屏的移动事件

电视端虚拟鼠标的设计相关推荐

  1. 基于ESP32-CAM 和 OpenCV 设计的手势控制虚拟鼠标

    概述 在本文中,我们将使用ESP32-CAM和OpenCV开发手势控制虚拟鼠标.ESP32 Camera Module和Python程序可用于无线控制鼠标跟踪和点击操作. 入门者必须具备 Python ...

  2. 在浏览器端调试代码并直接修改原文件、移动端虚拟键盘中实现搜索按钮

    在浏览器端调试代码并直接修改原文件: 此调试方法可以避免在浏览器调试完代码后在到原文件手动修改代码的弊端,其具体方法如下: 1.先将要调试的页面在浏览器(Google)打开,这里小编打开桌面test文 ...

  3. 玩转未来科技感!高端电商海报设计素材

    多设计师经常会遇到科技场景合成等难题,把控不准科技感的氛围表现.对科技感场景合成思 路及风格调性把控,是个难题. 还好优图网,带来玩转未来科技感!高端电商海报设计素材! 虚拟城市未来发展建设革命科技海 ...

  4. USB中文网之虚拟鼠标功能演示

    该功能是USB中文网的开发例程,其设计原理见:https://blog.csdn.net/T76230169/article/details/118609482?spm=1001.2014.3001. ...

  5. Cadence Virtual.Component.CO-Design.v2.2-ISO 1CD(虚拟元件协同设计,VCC)

    CADENAS产品: Cadence Specman.Elite.V5.0.Linux64-ISO 1CD Cadence Virtual.Component.CO-Design.v2.2-ISO 1 ...

  6. android投屏 电视软件,爱投屏电视端下载-爱投屏电视版v2.2.7 安卓版-速游网

    爱投屏软件能够为广大的用户带来福利,现在很多的家长都在反馈孩子在手机上看直播,太费眼睛了,因为屏幕实在是非常的小,看的时候要靠手机很近才能看清楚,所以特此推出了投屏的技术,.家长们可以在8688g速游 ...

  7. 基于配体的药效团建模和虚拟筛选研究设计新型HDAC2抑制剂

    摘要:组蛋白去乙酰化酶2 (HDAC2)属于组蛋白去乙酰化酶(HDAC)家族,已成为多种癌症治疗的治的重要治疗靶标.在Discovery Studio中使用3D-QSAR药效团生成(HypoGen算法 ...

  8. [开源] C语言项目实战 - 虚拟鼠标 - VirtualMouse

    C语言项目实战 - 虚拟鼠标 - VirtualMouse 目录 关于软件 软件介绍 使用帮助 项目介绍 源码及软件下载 知识点扫描 热键的使用 鼠标事件的模拟 字体的选用 开机自启动的设置 为软件添 ...

  9. android 横向滑动日期_移动端横向滑动如何设计?

    所谓的"左右横滑"交互英文名叫做"Horizontal Scrolling Lists",最早可能起源于 Windows Phone 的横向内容滑动设计.用于在 ...

最新文章

  1. 浅析 Linux 初始化 init 系统:sysvinit
  2. Java 四种线程池
  3. linux通过操作界面和命令行的方式查看ip地址、mac地址
  4. python三大库_Python 经典库汇总(3)
  5. 全局拉普拉斯平滑之(1)Strucutre extraction from texture via relative total variation及稀疏矩阵求解
  6. ic启动器怎么导入模组_Model Y和Model 3的模组拆解对比
  7. 多人上传文件公共网盘_360安全云盘多人共享完整版
  8. 整数规划的matlab计算,Matlab遗传算法解决整数规划问题
  9. 电脑文件误删除恢复的解决办法
  10. shell提示Algorithm negotiation fail
  11. 采用系统API实现的二维码扫描、识别和生成
  12. 标准差(Standard Deviation) 和 标准误差(Standard Error)
  13. Element-Ui 双重el-tabs组件选中第二层时,刷新导致第一层选中样式丢失问题以及解决方法
  14. 快速删除大文件利器 node 包 rimraf
  15. linux概述及环境搭建
  16. 大snbsp;汪小菲nbsp;闪婚
  17. 数据库索引结构(方法),一张图搞懂MySQL索引
  18. auto dvr使用教程_电缆盒和DVR真的使用那么多功率吗?
  19. 高速电路设计与仿真之过孔篇
  20. win7提权system与后门

热门文章

  1. 光源专家的8个打光技巧
  2. 基于单片机的modbus从机程序
  3. 使用ffmpeg将裸码文件转成wav文件
  4. 用python实现颜值打分,还能测测自己的颜值
  5. 监控局域网机器的屏幕
  6. c# 弹出虚拟键盘关闭虚拟键盘(适用win10、win7)学习记录(转载)
  7. 用速腾16线激光雷达跑gmapping
  8. Halcon算子解释大全
  9. 硬核黑科技告诉你,漫威 10 年到底有多少个角色?
  10. 安卓电池校正_笔记本电池损耗55%后一波三折的挽救经历