From d1691ae0cbbdd7dbc06c6d1b6060b6c515a73dc1 Mon Sep 17 00:00:00 2001 From: Backpack Date: Sun, 13 Jul 2025 17:29:07 +0800 Subject: [PATCH] send enter --- .../src-py/router/__pycache__/ws.cpython-312.pyc | Bin 6563 -> 9344 bytes wavecontrol-test/src-py/router/ws.py | 65 +++++++++++++++++++++ .../src/hand_landmark/gesture_handler.ts | 29 +++++++++ wavecontrol-test/src/store/app.ts | 2 +- 4 files changed, 95 insertions(+), 1 deletion(-) diff --git a/wavecontrol-test/src-py/router/__pycache__/ws.cpython-312.pyc b/wavecontrol-test/src-py/router/__pycache__/ws.cpython-312.pyc index c4a4500f865a41818580e7c37b22cf9b386b6e44..27ae0304e49a41954150ad801206d7424bb10908 100644 GIT binary patch delta 3533 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 delta 832 zcmZ9KO-vI}5XawiySweuZfPQIJ#M=qLpFnW-K@#8>Tl1503iEp-&7$@1^{4;Of+j%o@apY0E zy6$!>jGLCt&CYpVsO=IoVZWr?3l80hIcZKv=?cE}??FM139U(~Q-bDv~syGDQxXHXLsbS*9J`D zQ}++4pEex8hw2eXV@dtF8!$a7n8Du4n4;T^dY+Wh9lWlpwu7`GN;ph7O8BpcVTutZ z_?OeMv!>BiQUozlE_8T#rRFifFrE!Gx%()WiqP%GB;F4MVE|VG5%DAsomu`GP(eCD zDbx6?R`Y!U#>N=1yUfWJxGr19fvwtikny=zhh4#hEEnW3Td?7+U;uvyy5j&E#d(aubl2XEKiPz0v-?35(ts>G4{j`96G;W{K+VW}_CA7iUMq*r@e zxL%9exL%8C$(T@dkuItZ($#8G7m5ucMRbuOF@bBn)|kPM^`~GIyTb7r>vdVvwQ8ps z8O?+=-VE0&vs_Z6bFcAL_?T7!p)JO-9q>bJi*annJrLPq9A*St8XBWj(EMKYngaJ5 Y9-k?4Z%VAX!IVikn52}PTv_kt5A-j#pa1{> diff --git a/wavecontrol-test/src-py/router/ws.py b/wavecontrol-test/src-py/router/ws.py index dcea2e4..0f98da9 100644 --- a/wavecontrol-test/src-py/router/ws.py +++ b/wavecontrol-test/src-py/router/ws.py @@ -51,6 +51,9 @@ class WebSocketMessageType: MOUSE_MOVE = "mouse_move" MOUSE_CLICK = "mouse_click" + # 键盘操作类型 + SEND_KEYS = "send_keys" + class MessageSender: """消息发送器,发送给前端""" @@ -97,6 +100,65 @@ class GestureHandler: print("👉 正在点击鼠标") self.mouse.click(Button.left) + def send_keys(self, key_str: str) -> None: + """ + 发送按键事件(支持组合键) + + Args: + key_str: 按键字符串(如 'ctrl+r' 或 'F11') + """ + try: + keys = [self.__parse_key(key) for key in key_str.split("+")] + print("👉 正在点击发送案按键") + self.__execute_keys(keys) + except Exception as e: + print(f"发送按键失败: {e}") + + def __parse_key(self, key_str: str) -> Union[str, Key]: + """ + 解析单个按键 + + Args: + key_str: 按键字符串 + + Returns: + 解析后的按键对象 + """ + key_str = key_str.strip().lower() + + if hasattr(Key, key_str): + return getattr(Key, key_str) + elif len(key_str) == 1: + return key_str + elif key_str.startswith("f"): + try: + return getattr(Key, key_str) + except AttributeError: + raise ValueError(f"无效的功能键: {key_str}") + else: + raise ValueError(f"无效的按键: {key_str}") + + def __execute_keys(self, keys: List[Union[str, Key]]) -> None: + """ + 执行按键序列 + + Args: + keys: 按键列表 + """ + pressed_keys = [] + try: + # 按下所有键 + for key in keys: + self.keyboard.press(key) + pressed_keys.append(key) + + # 释放所有键(按相反顺序) + for key in reversed(pressed_keys): + self.keyboard.release(key) + except Exception as e: + print(f"执行按键失败: {e}") + + @router.websocket("/ws_wavecontrol") @@ -137,6 +199,9 @@ async def _handle_message( elif message.type == WebSocketMessageType.MOUSE_CLICK: gesture_handler.click_mouse() + # 处理键盘操作 + elif message.type == WebSocketMessageType.SEND_KEYS: + gesture_handler.send_keys(data["key_str"]) except json.JSONDecodeError: print("无效的JSON数据") except Exception as e: diff --git a/wavecontrol-test/src/hand_landmark/gesture_handler.ts b/wavecontrol-test/src/hand_landmark/gesture_handler.ts index d140948..b1382b7 100644 --- a/wavecontrol-test/src/hand_landmark/gesture_handler.ts +++ b/wavecontrol-test/src/hand_landmark/gesture_handler.ts @@ -95,6 +95,13 @@ export class TriggerAction { type: WsDataType.MOUSE_CLICK, }); } + + sendKeys(key_str: string) { + this.send({ + type: WsDataType.SEND_KEYS, + data: { key_str }, + }); + } } // 手势处理 @@ -199,6 +206,24 @@ export class GestureHandler { } /** + * 处理四根手指同时竖起手势 - 发送快捷键 + */ + private handleFourFingers() { + try { + const key_str = this.app_store.config.four_fingers_up_send || "f"; + const now = Date.now(); + if (now - this.lastFullScreenTime < this.FULL_SCREEN_INTERVAL) { + return; + } + this.lastFullScreenTime = now; + + this.triggerAction.sendKeys(key_str); + } catch (error) { + console.error("处理四指手势失败:", error); + } + } + + /** * 处理识别到的手势 → 执行相应动作 */ handleGesture(gesture: HandGesture, hand: HandInfo) { @@ -223,6 +248,10 @@ export class GestureHandler { this.handleMouseClick(); break; + case HandGesture.FOUR_FINGERS_UP: + this.handleFourFingers(); + break; + } } diff --git a/wavecontrol-test/src/store/app.ts b/wavecontrol-test/src/store/app.ts index 8e9f716..319c1c8 100644 --- a/wavecontrol-test/src/store/app.ts +++ b/wavecontrol-test/src/store/app.ts @@ -18,7 +18,7 @@ export const use_app_store = defineStore("app-store", { config: { auto_start: false, show_window: false, - four_fingers_up_send: "f", + four_fingers_up_send: "enter", selected_camera_id: "", // 识别框