当前位置: 首页 > ops >正文

swift flask python ipad当电脑键盘 实现osu x键和z键 长按逻辑有问题 quart 11毫秒

键盘不行我5星都打不过,磁轴不在身边

127.0.0.1不行要用192.168哪个地址

from flask import Flask
from pynput.keyboard import Controller
from threading import Threadapp = Flask(__name__)
keyboard = Controller()# 按下按键
@app.route("/press_down/<char>")
def press_down(char):if len(char) == 1 and char.lower() in "abcdefghijklmnopqrstuvwxyz":keyboard.press(char.lower())print(f"Key Down: {char}")return f"Key Down: {char}"else:return "Invalid key", 400# 松开按键
@app.route("/press_up/<char>")
def press_up(char):if len(char) == 1 and char.lower() in "abcdefghijklmnopqrstuvwxyz":keyboard.release(char.lower())print(f"Key Up: {char}")return f"Key Up: {char}"else:return "Invalid key", 400# 启动 Flask 在后台线程运行
def run_flask():app.run(host="0.0.0.0", port=5000)flask_thread = Thread(target=run_flask)
flask_thread.daemon = True
flask_thread.start()print("Flask server running at http://localhost:5000")# 防止主线程退出
try:while True:pass
except KeyboardInterrupt:print("Server stopped.")
import SwiftUIstruct ContentView: View {var body: some View {VStack(spacing: 20) {HStack {Button(action: {self.sendKeyPress(key: "x")}) {Text("发送 X").padding(.horizontal, 200).padding(.vertical, 200).background(Color.blue).foregroundColor(.white).cornerRadius(8)}Button(action: {self.sendKeyPress(key: "z")}) {Text("发送 Z").padding(.horizontal, 200).padding(.vertical, 200).background(Color.green).foregroundColor(.white).cornerRadius(8)}}}.padding()}// 发送按键:先按住再释放func sendKeyPress(key: String) {sendKey(key: key, action: "press_down") {self.sendKey(key: key, action: "press_up", completion: {})}}// 通用 HTTP 请求方法func sendKey(key: String, action: String, completion: @escaping () -> Void) {let startTime = Date() // 记录开始时间let urlString = "http://192.168.1.3:5000/\(action)/\(key)"guard let url = URL(string: urlString) else {completion()return}var request = URLRequest(url: url)request.httpMethod = "GET"URLSession.shared.dataTask(with: request) { data, response, error inlet endTime = Date() // 记录结束时间let timeInterval = endTime.timeIntervalSince(startTime) // 计算延迟if let error = error {print("[\(endTime)]: 请求失败(\(action) \(key)),延迟: \(timeInterval)s - 错误信息: \(error.localizedDescription)")} else {print("[\(endTime)]: 请求成功(\(action) \(key)),延迟: \(timeInterval)s")}completion()}.resume()}
}

0.4s延迟 

flask端才1ms延迟 

延迟变低版本

from flask import Flask
from pynput.keyboard import Controller
from threading import Thread
import timeapp = Flask(__name__)
keyboard = Controller()# 按下按键
@app.route("/press_down/<char>")
def press_down(char):start_time = time.time()  # 开始计时if len(char) == 1 and char.lower() in "abcdefghijklmnopqrstuvwxyz":keyboard.press(char.lower())print(f"Key Down: {char}")latency = time.time() - start_time  # 计算延迟print(f"[Latency] Press Down '{char}': {latency * 1000:.2f} ms")return f"Key Down: {char}"else:latency = time.time() - start_timeprint(f"[Latency] Invalid key (press_down): {latency * 1000:.2f} ms")return "Invalid key", 400# 松开按键
@app.route("/press_up/<char>")
def press_up(char):start_time = time.time()if len(char) == 1 and char.lower() in "abcdefghijklmnopqrstuvwxyz":keyboard.release(char.lower())print(f"Key Up: {char}")latency = time.time() - start_timeprint(f"[Latency] Press Up '{char}': {latency * 1000:.2f} ms")return f"Key Up: {char}"else:latency = time.time() - start_timeprint(f"[Latency] Invalid key (press_up): {latency * 1000:.2f} ms")return "Invalid key", 400# 启动 Flask 在后台线程运行
def run_flask():app.run(host="0.0.0.0", port=5000)flask_thread = Thread(target=run_flask)
flask_thread.daemon = True
flask_thread.start()print("Flask server running at http://localhost:5000")# 防止主线程退出
try:while True:time.sleep(1)
except KeyboardInterrupt:print("Server stopped.")

异步

from quart import Quart
from pynput.keyboard import Controller
import time
import asyncioapp = Quart(__name__)
keyboard = Controller()# 按下按键
@app.route("/press_down/<char>")
async def press_down(char):start_time = time.time()if len(char) == 1 and char.lower() in "abcdefghijklmnopqrstuvwxyz":# 使用 asyncio.to_thread 来在线程池中执行阻塞操作(推荐)await asyncio.to_thread(keyboard.press, char.lower())latency = (time.time() - start_time) * 1000print(f"[Latency] Press Down '{char}': {latency:.2f} ms")return f"Key Down: {char}"else:latency = (time.time() - start_time) * 1000print(f"[Latency] Invalid key (press_down): {latency:.2f} ms")return "Invalid key", 400# 松开按键
@app.route("/press_up/<char>")
async def press_up(char):start_time = time.time()if len(char) == 1 and char.lower() in "abcdefghijklmnopqrstuvwxyz":await asyncio.to_thread(keyboard.release, char.lower())latency = (time.time() - start_time) * 1000print(f"[Latency] Press Up '{char}': {latency:.2f} ms")return f"Key Up: {char}"else:latency = (time.time() - start_time) * 1000print(f"[Latency] Invalid key (press_up): {latency:.2f} ms")return "Invalid key", 400if __name__ == "__main__":print("Starting Quart server at http://localhost:5000")app.run(host="0.0.0.0", port=5000)
import SwiftUIstruct ContentView: View {var body: some View {VStack(spacing: 20) {HStack {Button(action: {Task {await sendKeyPress(key: "x")}}) {Text("发送 X").padding(.horizontal, 200).padding(.vertical, 200).background(Color.blue).foregroundColor(.white).cornerRadius(8)}Button(action: {Task {await sendKeyPress(key: "z")}}) {Text("发送 Z").padding(.horizontal, 200).padding(.vertical, 200).background(Color.green).foregroundColor(.white).cornerRadius(8)}}}.padding()}// 发送按键:先按住再释放,分别记录每次请求的延迟func sendKeyPress(key: String) async {do {try await sendKey(key: key, action: "press_down")try await sendKey(key: key, action: "press_up")} catch {print("按键 $key) 请求失败: $error)")}}// 通用 HTTP 请求方法(async/await 版本)func sendKey(key: String, action: String) async throws {let startTime = Date()let urlString = "http://192.168.1.3:5000/\(action)/\(key)"guard let url = URL(string: urlString) else {print("无效的 URL($key))")throw URLError(.badURL)}do {let (data, response) = try await URLSession.shared.data(from: url)if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode != 200 {let error = NSError(domain: "HTTP Error", code: httpResponse.statusCode, userInfo: nil)throw error}let endTime = Date()let duration = endTime.timeIntervalSince(startTime)print("[成功] \(action) '$key)' 耗时: $duration * 1000.0:.1f) ms")} catch {let endTime = Date()let duration = endTime.timeIntervalSince(startTime)print("[失败] $action) '$key)' 耗时: $duration * 1000.0:.1f) ms - 错误: $error.localizedDescription)")throw error}}
}

我要改osu了

已经和键盘差不多了还是卡

太鼓是可以打了

202505132300 ipad当键盘打osu太鼓

我怀疑是长按模块有问题

http://www.xdnf.cn/news/5772.html

相关文章:

  • Spark 缓存(Caching)
  • 2025年PMP 学习十一 第8章 项目质量管理(8.3)
  • 运行Spark程序-在Idea中
  • 基于智能家居项目 实现DHT11驱动源代码
  • Linux目录和文件
  • idea Maven 打包SpringBoot可执行的jar包
  • C语言 ——— 函数栈帧的创建和销毁
  • Qt6.5.3 windows下安装教程
  • c++STL-list的使用和迭代器
  • 【AIGC 温柔档案】:镂空蕾丝与柔和线条的唯美算法融合
  • PostgreSQL 配置设置函数
  • MySQL 8.0 OCP 英文题库解析(四)
  • STM32 修炼手册
  • PostgreSQL 服务器信号函数
  • 设计模式深度解析:AI大模型下的策略模式与模板方法模式对比解析
  • 力扣HOT100之二叉树:543. 二叉树的直径
  • web 自动化之 KDT 关键字驱动详解
  • 什么是Git?
  • 性能优化--无分支编程的实际应用场景
  • 基于动态规划的强化学习方法
  • 佰力博科技与您探讨表面电阻的测试方法及应用领域
  • 小刚说C语言刷题—1080质因子
  • Kafka 4.0版本的推出:数据处理新纪元的破晓之光
  • aardio - 虚表 —— vlistEx.listbar2 多层菜单演示
  • CSV注入攻击技术解析
  • vscode不能跳转到同一个工作区的其他文件夹
  • 为什么要在 input() 后加 .strip()?
  • 基于SSM实现的健身房系统功能实现十六
  • springboot配置tomcat端口
  • 掌控随心 - 服务网格的流量管理艺术 (Istio 实例)