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太鼓
我怀疑是长按模块有问题