mouse_automation/
lib.rs

1extern "system" {
2    pub fn SendInput(cInputs: u32, pInputs: *mut Input, cbSize: i32) -> u32;
3    pub fn GetSystemMetrics(nIndex: i32) -> i32;
4}
5
6pub struct MouseInput {
7    pub dx: i32,
8    pub dy: i32,
9    pub mouse_data: u32,
10    pub flags: u32,
11    pub time: u32,
12    pub extra_info: u64,
13}
14
15pub struct Input {
16    pub input_type: u32,
17    pub input_data: MouseInput,
18}
19
20pub fn send_input(dx: i32, dy: i32, mouse_data: u32, flags: u32) {
21    let mut input = Input{
22        input_type: 0, 
23        input_data: MouseInput {
24            dx: dx, 
25            dy: dy, 
26            mouse_data: mouse_data, 
27            flags: flags, 
28            time: 0, 
29            extra_info: 0
30        }
31    };
32    unsafe {SendInput(1, &mut input, std::mem::size_of::<Input>() as i32);}
33}
34
35pub fn move_mouse(mut x: i32, mut y: i32, abs: bool) {
36    let mut flags = 0x0001;
37    if abs == true {
38        x = x*65335/unsafe{GetSystemMetrics(78)};
39        y = y*65335/unsafe{GetSystemMetrics(79)};
40        flags = flags | 0x8000;
41    }
42    send_input(x, y, 0, flags);
43}
44
45pub struct MouseButton {
46    pub e_down: u32,
47    pub e_up: u32,
48}
49
50impl MouseButton {
51    pub fn down(&self) {send_input(0, 0, 0, self.e_down)}
52    pub fn up(&self) {send_input(0, 0, 0, self.e_up)}
53}
54
55pub const LEFT: MouseButton = MouseButton{e_down: 0x0002, e_up: 0x0004};
56pub const RIGHT: MouseButton = MouseButton{e_down: 0x0008, e_up: 0x0010};
57pub const MIDDLE: MouseButton = MouseButton{e_down: 0x0020, e_up: 0x0040};
58
59pub fn wheel(movement: u32) {send_input(0, 0, movement, 0x0800)}