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