mirror of
https://github.com/feschber/lan-mouse.git
synced 2026-04-02 02:01:29 +03:00
windows: impl back and forward mouse buttons
This commit is contained in:
@@ -29,11 +29,13 @@ use windows::Win32::UI::WindowsAndMessaging::{
|
|||||||
LLKHF_EXTENDED, MSG, MSLLHOOKSTRUCT, WH_KEYBOARD_LL, WH_MOUSE_LL, WINDOW_STYLE,
|
LLKHF_EXTENDED, MSG, MSLLHOOKSTRUCT, WH_KEYBOARD_LL, WH_MOUSE_LL, WINDOW_STYLE,
|
||||||
WM_DISPLAYCHANGE, WM_KEYDOWN, WM_KEYUP, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MBUTTONDOWN,
|
WM_DISPLAYCHANGE, WM_KEYDOWN, WM_KEYUP, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MBUTTONDOWN,
|
||||||
WM_MBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_SYSKEYDOWN,
|
WM_MBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_SYSKEYDOWN,
|
||||||
WM_SYSKEYUP, WM_USER, WNDCLASSW, WNDPROC,
|
WM_SYSKEYUP, WM_USER, WM_XBUTTONDOWN, WM_XBUTTONUP, WNDCLASSW, WNDPROC,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::client::Position;
|
use crate::client::Position;
|
||||||
use crate::event::{KeyboardEvent, PointerEvent, BTN_LEFT, BTN_MIDDLE, BTN_RIGHT};
|
use crate::event::{
|
||||||
|
KeyboardEvent, PointerEvent, BTN_BACK, BTN_FORWARD, BTN_LEFT, BTN_MIDDLE, BTN_RIGHT,
|
||||||
|
};
|
||||||
use crate::scancode::Linux;
|
use crate::scancode::Linux;
|
||||||
use crate::{
|
use crate::{
|
||||||
capture::InputCapture,
|
capture::InputCapture,
|
||||||
@@ -142,7 +144,26 @@ fn to_mouse_event(wparam: WPARAM, lparam: LPARAM) -> Option<PointerEvent> {
|
|||||||
axis: 0,
|
axis: 0,
|
||||||
value: -(mouse_low_level.mouseData as i32) as f64,
|
value: -(mouse_low_level.mouseData as i32) as f64,
|
||||||
}),
|
}),
|
||||||
_ => None,
|
WPARAM(p) if p == WM_XBUTTONDOWN as usize || p == WM_XBUTTONUP as usize => {
|
||||||
|
let hb = mouse_low_level.mouseData >> 16;
|
||||||
|
let button = match hb {
|
||||||
|
1 => BTN_BACK,
|
||||||
|
2 => BTN_FORWARD,
|
||||||
|
_ => {
|
||||||
|
log::warn!("unknown mouse button");
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Some(PointerEvent::Button {
|
||||||
|
time: 0,
|
||||||
|
button,
|
||||||
|
state: if p == WM_XBUTTONDOWN as usize { 1 } else { 0 },
|
||||||
|
})
|
||||||
|
}
|
||||||
|
w => {
|
||||||
|
log::warn!("unknown mouse event: {w:?}");
|
||||||
|
None
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,14 +8,18 @@ use async_trait::async_trait;
|
|||||||
use std::ops::BitOrAssign;
|
use std::ops::BitOrAssign;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use tokio::task::AbortHandle;
|
use tokio::task::AbortHandle;
|
||||||
use windows::Win32::UI::Input::KeyboardAndMouse::{SendInput, INPUT_0, KEYEVENTF_EXTENDEDKEY};
|
use windows::Win32::UI::Input::KeyboardAndMouse::{
|
||||||
|
SendInput, INPUT_0, KEYEVENTF_EXTENDEDKEY, MOUSEEVENTF_XDOWN, MOUSEEVENTF_XUP,
|
||||||
|
};
|
||||||
use windows::Win32::UI::Input::KeyboardAndMouse::{
|
use windows::Win32::UI::Input::KeyboardAndMouse::{
|
||||||
INPUT, INPUT_KEYBOARD, INPUT_MOUSE, KEYBDINPUT, KEYEVENTF_KEYUP, KEYEVENTF_SCANCODE,
|
INPUT, INPUT_KEYBOARD, INPUT_MOUSE, KEYBDINPUT, KEYEVENTF_KEYUP, KEYEVENTF_SCANCODE,
|
||||||
MOUSEEVENTF_HWHEEL, MOUSEEVENTF_LEFTDOWN, MOUSEEVENTF_LEFTUP, MOUSEEVENTF_MIDDLEDOWN,
|
MOUSEEVENTF_HWHEEL, MOUSEEVENTF_LEFTDOWN, MOUSEEVENTF_LEFTUP, MOUSEEVENTF_MIDDLEDOWN,
|
||||||
MOUSEEVENTF_MIDDLEUP, MOUSEEVENTF_MOVE, MOUSEEVENTF_RIGHTDOWN, MOUSEEVENTF_RIGHTUP,
|
MOUSEEVENTF_MIDDLEUP, MOUSEEVENTF_MOVE, MOUSEEVENTF_RIGHTDOWN, MOUSEEVENTF_RIGHTUP,
|
||||||
MOUSEEVENTF_WHEEL, MOUSEINPUT,
|
MOUSEEVENTF_WHEEL, MOUSEINPUT,
|
||||||
};
|
};
|
||||||
|
use windows::Win32::UI::WindowsAndMessaging::{XBUTTON1, XBUTTON2};
|
||||||
|
|
||||||
|
use crate::event::{BTN_BACK, BTN_FORWARD, BTN_LEFT, BTN_MIDDLE, BTN_RIGHT};
|
||||||
use crate::{
|
use crate::{
|
||||||
client::{ClientEvent, ClientHandle},
|
client::{ClientEvent, ClientHandle},
|
||||||
event::Event,
|
event::Event,
|
||||||
@@ -145,23 +149,32 @@ fn rel_mouse(dx: i32, dy: i32) {
|
|||||||
fn mouse_button(button: u32, state: u32) {
|
fn mouse_button(button: u32, state: u32) {
|
||||||
let dw_flags = match state {
|
let dw_flags = match state {
|
||||||
0 => match button {
|
0 => match button {
|
||||||
0x110 => MOUSEEVENTF_LEFTUP,
|
BTN_LEFT => MOUSEEVENTF_LEFTUP,
|
||||||
0x111 => MOUSEEVENTF_RIGHTUP,
|
BTN_RIGHT => MOUSEEVENTF_RIGHTUP,
|
||||||
0x112 => MOUSEEVENTF_MIDDLEUP,
|
BTN_MIDDLE => MOUSEEVENTF_MIDDLEUP,
|
||||||
|
BTN_BACK => MOUSEEVENTF_XUP,
|
||||||
|
BTN_FORWARD => MOUSEEVENTF_XUP,
|
||||||
_ => return,
|
_ => return,
|
||||||
},
|
},
|
||||||
1 => match button {
|
1 => match button {
|
||||||
0x110 => MOUSEEVENTF_LEFTDOWN,
|
BTN_LEFT => MOUSEEVENTF_LEFTDOWN,
|
||||||
0x111 => MOUSEEVENTF_RIGHTDOWN,
|
BTN_RIGHT => MOUSEEVENTF_RIGHTDOWN,
|
||||||
0x112 => MOUSEEVENTF_MIDDLEDOWN,
|
BTN_MIDDLE => MOUSEEVENTF_MIDDLEDOWN,
|
||||||
|
BTN_BACK => MOUSEEVENTF_XDOWN,
|
||||||
|
BTN_FORWARD => MOUSEEVENTF_XDOWN,
|
||||||
_ => return,
|
_ => return,
|
||||||
},
|
},
|
||||||
_ => return,
|
_ => return,
|
||||||
};
|
};
|
||||||
|
let mouse_data = match button {
|
||||||
|
BTN_BACK => XBUTTON1 as u32,
|
||||||
|
BTN_FORWARD => XBUTTON2 as u32,
|
||||||
|
_ => 0,
|
||||||
|
};
|
||||||
let mi = MOUSEINPUT {
|
let mi = MOUSEINPUT {
|
||||||
dx: 0,
|
dx: 0,
|
||||||
dy: 0, // no movement
|
dy: 0, // no movement
|
||||||
mouseData: 0,
|
mouseData: mouse_data,
|
||||||
dwFlags: dw_flags,
|
dwFlags: dw_flags,
|
||||||
time: 0,
|
time: 0,
|
||||||
dwExtraInfo: 0,
|
dwExtraInfo: 0,
|
||||||
|
|||||||
16
src/event.rs
16
src/event.rs
@@ -84,7 +84,21 @@ impl Display for PointerEvent {
|
|||||||
time: _,
|
time: _,
|
||||||
button,
|
button,
|
||||||
state,
|
state,
|
||||||
} => write!(f, "button({button}, {state})"),
|
} => {
|
||||||
|
let str = match *button {
|
||||||
|
BTN_LEFT => Some("left"),
|
||||||
|
BTN_RIGHT => Some("right"),
|
||||||
|
BTN_MIDDLE => Some("middle"),
|
||||||
|
BTN_FORWARD => Some("forward"),
|
||||||
|
BTN_BACK => Some("back"),
|
||||||
|
_ => None,
|
||||||
|
};
|
||||||
|
if let Some(button) = str {
|
||||||
|
write!(f, "button({button}, {state})")
|
||||||
|
} else {
|
||||||
|
write!(f, "button({button}, {state}")
|
||||||
|
}
|
||||||
|
}
|
||||||
PointerEvent::Axis {
|
PointerEvent::Axis {
|
||||||
time: _,
|
time: _,
|
||||||
axis,
|
axis,
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ async fn handle_udp_rx(
|
|||||||
if !ignore_event {
|
if !ignore_event {
|
||||||
// consume event
|
// consume event
|
||||||
emulate.consume(event, handle).await;
|
emulate.consume(event, handle).await;
|
||||||
log::trace!("{event:?} => emulate");
|
log::trace!("{event} => emulate");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
State::AwaitingLeave => {
|
State::AwaitingLeave => {
|
||||||
|
|||||||
Reference in New Issue
Block a user