本文由 资源共享网 – zgwxw 发布,转载请注明出处,如有问题请联系我们!手机陀螺仪控制电脑鼠标源码(原生安卓+Python)
开发语言: python
数据库 : mysql
资源语言: 中文
电脑端:Python
安卓端:原生开发
使用方法:
1 电脑端打开,mouseFly.exe,在右下角显示出一个黑猫图标即表示运行成功(测试环境WIN11 Python3.10)。 双击黑猫可隐藏黑猫,但程序并未退出(因为我不知道如何结束 asyncio.get_event_loop()。
2 安卓安卓安卓 手机安装 P娃儿猫mouseFly_v9.0.2.apk ,必须开启悬浮窗权限,启动以后没有界面,但会显示一个悬浮的黑猫(自动吸附在屏幕边缘),然后根据提示输入电脑端的IP地址加端口(默认端口2309),连接上就开始晃动手机吧,电脑上的鼠标会飞起来的。
(1) 手机沿X轴方向(俯仰)转动,控制鼠标上下。
(2)手机沿z轴方向(拧螺丝)转动,控制鼠标左右。(为什么不是Y轴,因为我的手机不准,其它手机就不知道了,代码中有注释,可以改)。
(3)点击黑猫图标单击鼠标左键,长按黑猫退出程序(尤其是发现电脑端鼠标失控时)。
电脑端 win11 pypthon3.10.9
import asyncio import websockets import pyautogui import json import os from infi.systray import SysTrayIcon sw, sh = pyautogui.size() pyautogui.FAILSAFE = False async def deal(websocket, path): async for message in websocket: try: o = json.loads(message) if (o.get("type") is not None): if (o["type"] == "move"): pyautogui.moveTo(o["x"]/10000*sw, o["y"]/10000*sh) # pyautogui.moveTo(0.5*sw, o["y"]/3000*sh) if (o["type"] == "mouseDown"): print("server:", message) pyautogui.click() except Exception as e: print(str(e)) def onExit(*self, **args): print("exit") systray = SysTrayIcon(os.path.dirname(__file__) + "/Pwaerm.ico", "P娃儿猫鼠标助手", (), on_quit=onExit) systray.start() try: startServer = websockets.serve(deal, "", 2309) asyncio.get_event_loop().run_until_complete(startServer) asyncio.get_event_loop().run_forever() except Exception as e: print(str(e)) systray.shutdown()
安卓端,基于auto.jsPro 8.3.16制作
//-----------------------悬浮窗------------------------------------ function showAdvancedBtn() { if (advancedWin) { advancedWin.box.attr("alpha", "0.9"); advancedWin.setTouchable(true); return; } //<fab id="advanced" src="@drawable/ic_create_black_48dp" w="auto" h="auto" margin="20" tint="#000000" alpha="0.5" /> advancedWin = floaty.rawWindow( <frame id="box" alpha="0.9"> <img id="advanced" circle="true" src="http://www.flash023.cn/Pwaerm/icon/Pwaerm.png" w="50" h="50" margin="20" alpha="0.8" /> </frame> ); setTimeout(function () { advancedWin.setPosition(device.width * 0.8, device.height * 0.7); advancedWin.setTouchable(true); }, 100); function getDistance(_d, _d2) { var _xd = Math.abs(_d.x - _d2.x); var _yd = Math.abs(_d.y - _d2.y); return Math.sqrt(_xd * _xd + _yd * _yd); } function moveTo(_obj, _point, _t) { var __t = _t * 1000 / 30;//每秒10帧 var _T = setInterval(function () { var _x = _obj.getX() + (_point.x - _obj.getX()) * 0.3; var _y = _obj.getY() + (_point.y - _obj.getY()) * 0.3; _obj.setPosition(_x, _y); if (getDistance({ x: _x, y: _y }, _point) < 90) { _obj.setPosition(_point.x, _point.y); clearInterval(_T); } }, __t); } //记录按键被按下时的触摸坐标 var downPoint; //记录按键被按下时的悬浮窗位置 var windowPoint; //记录按键被按下的时间以便判断长按等动作 var downTime; var downInterval; var offsetX = 80; var isLongTouch = false; advancedWin.advanced.setOnTouchListener(function (view, event) { switch (event.getAction()) { case event.ACTION_DOWN: downPoint = { x: event.getRawX(), y: event.getRawY() }; windowPoint = { x: advancedWin.getX(), y: advancedWin.getY() }; downTime = new Date().getTime(); isLongTouch = false; downInterval = setInterval(() => { var _d = getDistance({ x: event.getRawX(), y: event.getRawY() }, downPoint); //console.log(_d < 100); if (new Date().getTime() - downTime > 1600 && _d < 100) { isLongTouch = true; console.log("长按"); clearInterval(downInterval); stopOtherEngines(true); } else { if (_d > 100) { clearInterval(downInterval); } } }, 100); return true; case event.ACTION_MOVE: if (isLongTouch) { return true; } //移动手指时调整悬浮窗位置 advancedWin.setPosition(windowPoint.x + (event.getRawX() - downPoint.x), windowPoint.y + (event.getRawY() - downPoint.y)); return true; case event.ACTION_UP: if (downInterval != undefined) { clearInterval(downInterval); } if (isLongTouch) { return true; } //手指弹起时如果偏移很小则判断为点击 if (getDistance({ x: event.getRawX(), y: event.getRawY() }, downPoint) < 100) { advancedWin.setPosition(windowPoint.x, windowPoint.y); if (new Date().getTime() - downTime < 1000) { console.log("短按"); events.broadcast.emit("MOUSE_DOWN", ""); } if (new Date().getTime() - downTime > 3000) { console.log("长按后弹起"); } } else { var _x = event.getRawX() > device.width * 0.5 ? device.width - advancedWin.width * 0.5 - offsetX : offsetX - advancedWin.width * 0.5; var _y = windowPoint.y + (event.getRawY() - downPoint.y); if (event.getRawY() < device.height * 0.1) { _y = device.height * 0.1; } if (event.getRawY() > device.height * 0.8) { _y = device.height * 0.8; } _y -= advancedWin.height * 0.5; moveTo(advancedWin, { x: _x, y: _y }, 0.5); } return true; } return true; }); } function stopOtherEngines(_exit) { if (workThread && workThread.isAlive()) { workThread.interrupt(); } workThread = null; if (_exit) { engines.myEngine().forceStop(); } } function startWorkEngines() { stopOtherEngines(); workThread = threads.start(workHandler); } function showUrlInput(_title) { var _url = rawInput(_title, storage.get("url")); if (_url) { if (_url && _url.length >= 4) { storage.put("url", _url); showContentDialog("地址已经保存,尝试连接中..."); showAdvancedBtn(); } }; } if (typeof storage == "undefined") { storage = storages.create("mouseFly"); } function showContentDialog(_title) { hideConnectDialog(); connectDialog = dialogs.build({ title: _title, progress: { max: -1 }, cancelable: false }).show(); if (!_title) { toastLog("呼叫超时,请检查..."); } setTimeout(hideConnectDialog, 5000); } function hideConnectDialog() { if (connectDialog) { connectDialog.dismiss(); connectDialog = null; } } function init() { if (!storage.get("url")) { showUrlInput("请输入电脑端的IP地址和端口号:"); } else { showContentDialog("正在呼叫电脑端..."); showAdvancedBtn(); } events.broadcast.on("SHOW_URL_INPUT", showUrlInput); events.broadcast.on("HIDE_CONNECT_DIALOG", hideConnectDialog) startWorkEngines(); setInterval(() => { }, 1000); } var advancedWin; var workThread; var connectDialog; //-------------------------主要功能区------------------------- function workHandler() { var azimuth; var data; sensors.register("gyroscope").on("change", (event, _x, _y, _z) => { //console.log(Math.floor(_y * 1000)); }) sensors.register("orientation").on("change", (event, _x, _y, _z) => { /* event SensorEvent 传感器事件,用于获取传感器数据变化时的所有信息 _x {number} 方位角,从地磁指北方向线起,依顺时针方向到y轴之间的水平夹角,单位角度,范围0~359 _y {number} 绕x轴旋转的角度,当设备水平放置时该值为0,当设备顶部翘起时该值为正数,当设备尾部翘起时该值为负数,单位角度,范围-180~180 _z {number} 绕z轴顺时针旋转的角度,单位角度,范围-90~90 */ //我的手机指南针方向不准,所以改为Z轴方向 _x = -_z; if (azimuth == undefined) { azimuth = Math.floor(_x); } var _v = 20; _x -= azimuth; if (_x < -_v) { _x = -_v; } if (_x > _v) { _x = _v; } _x = Math.floor((_v + _x) / (_v * 2) * 10000); //console.log(_x) //限制垂直方向的角度为+-20,精度为10000 if (_y < -_v) { _y = -_v; } if (_y > _v) { _y = _v; } _y = Math.floor((_v + _y) / (_v * 2) * 10000); data = { type: "move", x: _x, y: _y }; if (ws) { ws.send(JSON.stringify(data)); } }); events.broadcast.on("MOUSE_DOWN", () => { if (ws) { console.log("---------------短按------------------"); data = { type: "mouseDown" }; ws.send(JSON.stringify(data)); } }) function socketInit() { if (!storage.get("url")) { log(storage.get("url")); events.broadcast.emit("SHOW_URL_INPUT", ""); return; } ws = web.newWebSocket("ws://" + storage.get("url"), { eventThread: 'this' }); ws.on("open", (res, ws) => { events.broadcast.emit("HIDE_CONNECT_DIALOG", ""); toastLog("WebSocket连接成功!"); }) ws.on("failure", (err, res, _ws) => { //log("WebSocket连接失败"); //console.error(err); toastLog("socket连接失败,请确认电脑端软件已经开启且地址输入正确。"); events.broadcast.emit("HIDE_CONNECT_DIALOG", ""); events.broadcast.emit("SHOW_URL_INPUT", "socket连接失败,请确认电脑端软件已经开启且地址输入正确。"); ws.removeAllListeners(); ws = null; setTimeout(socketInit, 5000); }) ws.on("closed", (code, reason, _ws) => { ws.removeAllListeners(); ws = null; }); } var ws; socketInit(); setInterval(() => { }, 3000); } init();
其它资源(手机陀螺仪控制电脑鼠标源码(原生安卓+Python))网址:https://www.08i8.com/ttkfzy/detail83438.html;转载请注明!
与《手机陀螺仪控制电脑鼠标源码(原生安卓+Python)》相关的《完整源码》
ASP正版思索者防伪系统源码多品牌版本 带wap手机端查询_源码下载
源码介绍 输入的防伪码为真,将弹出恭喜,你查询的商品是原装正品,商品信息如下:商品名(这个地方为红色显示)为真,则可以输入登记姓名,电话,购买地。点击登记信息后用户的信息就能在后台查到了。如果输入的防伪码为假,则提示该防伪码不存在或被查询次数过多,请谨防假冒!手机移动端:同电脑端功能一样。 后台功能概述:1.数据库管理:备份及恢复等功能2.添加和管理商品信息功能3.生成防伪码功能:可以生成纯数字...
2 94910 0
PHP彩虹代刷5.1网站源码全解密破解版+自适应手机+多接口支付_源码下载
源码介绍更新说明:V5.11.修复同系统对接问题2.修复分站提成问题3.增加分站排行榜额外奖励4.工单可批量处理V5.01.新增商品加价模板,可批量设置加价2.全新的管理员后台和分站后台界面3.新增同系统网站对接4.新增工单系统,订单详情页面增加投诉订单5.新增用户注册功能6.新增每日签到、站点消息功能7.前台查单界面可根据订单号查询8.首页增加商品分类图片显示界面9.价格监控可自动上下架商品10...
4 95312 0
【固码免签系统】WX固码免签约实时监控系统源码带手机APP端[带搭建教程]
[gallery columns="2" link="file" size="full" ids="3962,3963"]【固码免签系统】WX固码免签约实时监控系统源码带手机APP端[带搭建教程] 搭建教程:Linux 服务器,安装好Nginx 1.16.0 mysql 5.6+ php 5.6 +这套源码是客户花了6K从某站上面买的,搭建的话有一点难度先去开启mysqli的配置参数先APP工程...
1 95608 0
王者荣耀特效安卓美化助手,免费下载
3 94572 0
安卓手机GIF图片编辑软件APP / GIF助手v2.3.2 去广告清爽版
GIF助手去广告版是一款功能强大的手机GIF图片转换软件,支持将GIF图片转换为视频,支持视频转换GIF图片、GIF图片分解等功能,玩法多样,界面去广告清爽简洁,非常实用!
1 94894 0
安卓手机屏幕录制APP:乐秀录屏大师v3.2.1 直装会员破解版
[gallery link="file" size="full" ids="4468,4467,4466"]安卓屏幕录制软件:乐秀录屏大师v3.2.1 直装会员破解版乐秀录屏大师(Screen Recorder V Recorder)是乐秀视频编辑器旗下一款适用于各大安卓平台的短视频手机录屏神器,操作简单没有繁琐的录屏步骤,就算手机没有root权限也可以轻松进行超清视频录制、屏幕截图、同步录音、视...
1 95257 0
C#控制WNMP开源程序 3.0
WNMP即为Win+Nginx+MySQL+PHP的环境组合,该作品仅供演示。纯绿色运行。直接使用,将Bin\\Debug,复制出来即可。主要功能:1.所有功能,读、写注册表完成;2.每个功能参数配置,支持智能纠正,防止发生意外错误;3.只允许一个实例运行;4.关闭提示,隐藏、退出、退出所有服务、记住我的选择等功能。集成产品:1.Nginx1.7.7官方原版;2.PHP5.5.8官方原版;3.My...
5 95602 0
C#控制Nginx+PHP+MySQL集成环境 1.0
C#控制Nginx+PHP+MySQL集成环境实例源码,基于Net2.0开发环境,纯绿色运行。直接使用,将Bin\\Debug,复制出来即可使用。主要功能:1.所有功能通过读写注册表功能;2.每个功能以及参数配置支持纠正功能,防止错误;3.只允许一个实例运行;4.关闭提示,隐藏、退出、退出所有服务、记住我的选择等功能。注意:开发环境为Visual Studio 2012
5 95482 0
精美半透明效果宝塔控制面板美化模板_源码下载
源码介绍 安装说明:1.Linux服务器解压覆盖到/www/server/panel/BTPanel/ Windows服务器解压覆盖到宝塔安装的磁盘位置\\\\BtSoft\\\\panel\\\\BTPanel2:(1)Linux进入SSH,输入bt,选择9,清空面板缓存(2)Windows按住Windows键和“R”键,输入cmd,再输入bt,选择数字9,清空面板缓存3.清空浏览器缓存4...
4 95065 0