From 2724bd40000f81b5e316ea867fee66bf9761abc0 Mon Sep 17 00:00:00 2001 From: rustdesk Date: Mon, 9 May 2022 01:36:56 +0800 Subject: [PATCH] try out unicode if key_down fail --- libs/enigo/src/macos/macos_impl.rs | 6 +++++- libs/enigo/src/win/win_impl.rs | 6 +++++- src/server/input_service.rs | 21 ++++++++++++++++----- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/libs/enigo/src/macos/macos_impl.rs b/libs/enigo/src/macos/macos_impl.rs index 328285f45..53ffa1803 100644 --- a/libs/enigo/src/macos/macos_impl.rs +++ b/libs/enigo/src/macos/macos_impl.rs @@ -354,9 +354,13 @@ impl KeyboardControllable for Enigo { } fn key_down(&mut self, key: Key) -> crate::ResultType { + let code = self.key_to_keycode(key); + if code == 0 { + return Err("".into()); + } if let Some(src) = self.event_source.as_ref() { if let Ok(event) = - CGEvent::new_keyboard_event(src.clone(), self.key_to_keycode(key), true) + CGEvent::new_keyboard_event(src.clone(), code, true) { self.post(event); } diff --git a/libs/enigo/src/win/win_impl.rs b/libs/enigo/src/win/win_impl.rs index 79a7c0b49..c1fc32131 100644 --- a/libs/enigo/src/win/win_impl.rs +++ b/libs/enigo/src/win/win_impl.rs @@ -195,7 +195,11 @@ impl KeyboardControllable for Enigo { } fn key_down(&mut self, key: Key) -> crate::ResultType { - let res = keybd_event(0, self.key_to_keycode(key), 0); + let code = self.key_to_keycode(key); + if code == 0 || code == 65535 { + return Err("".into()); + } + let res = keybd_event(0, code, 0); if res == 0 { let err = get_error(); if !err.is_empty() { diff --git a/src/server/input_service.rs b/src/server/input_service.rs index 3f6ea2907..8c5f3060b 100644 --- a/src/server/input_service.rs +++ b/src/server/input_service.rs @@ -684,11 +684,22 @@ fn handle_key_(evt: &KeyEvent) { } Some(key_event::Union::chr(chr)) => { if evt.down { - allow_err!(en.key_down(get_layout(chr))); - KEYS_DOWN - .lock() - .unwrap() - .insert(chr as u64 + KEY_CHAR_START, Instant::now()); + if en.key_down(get_layout(chr)).is_ok() { + KEYS_DOWN + .lock() + .unwrap() + .insert(chr as u64 + KEY_CHAR_START, Instant::now()); + } else { + if let Ok(chr) = char::try_from(chr) { + let mut x = chr.to_string(); + if get_modifier_state(Key::Shift, &mut en) + || get_modifier_state(Key::CapsLock, &mut en) + { + x = x.to_uppercase(); + } + en.key_sequence(&x); + } + } } else { en.key_up(get_layout(chr)); KEYS_DOWN