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

发布于:2025-05-13 ⋅ 阅读:(6) ⋅ 点赞:(0)

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

127.0.0.1不行要用192.168哪个地址

from flask import Flask
from pynput.keyboard import Controller
from threading import Thread

app = 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 SwiftUI

struct 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 in
            let 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 time

app = 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_time
        print(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_time
        print(f"[Latency] Press Up '{char}': {latency * 1000:.2f} ms")
        return f"Key Up: {char}"
    else:
        latency = time.time() - start_time
        print(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 asyncio

app = 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) * 1000
        print(f"[Latency] Press Down '{char}': {latency:.2f} ms")
        return f"Key Down: {char}"
    else:
        latency = (time.time() - start_time) * 1000
        print(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) * 1000
        print(f"[Latency] Press Up '{char}': {latency:.2f} ms")
        return f"Key Up: {char}"
    else:
        latency = (time.time() - start_time) * 1000
        print(f"[Latency] Invalid key (press_up): {latency:.2f} ms")
        return "Invalid key", 400


if __name__ == "__main__":
    print("Starting Quart server at http://localhost:5000")
    app.run(host="0.0.0.0", port=5000)
import SwiftUI

struct 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太鼓

我怀疑是长按模块有问题