< 返回版块

zwl1619 发表于 2021-12-07 05:16

Tags:rust

这里有个json文件 test.json:

[
	[1000,800,1],
	[1500,0,2],
	[1600,0,3],
	[2500,300,4]
]

第1个元素表示开始时间(毫秒),
第2个元素表示持续时长(毫秒),
第3个元素表示键盘按键,1\2\3\4分别对应a\b\c\d

我想实现的是:
当时间到达第1个元素表示的开始时间时,按下第3个元素代表的按键,并持续第2个元素代表的时长。

用第一组数据举例来说:
当时间来到1000毫秒时,按下键盘a键并持续800毫秒。 其他同理。

我准备用这三个库:delay_timer, enigo, serde_json
https://crates.io/crates/delay_timer
https://crates.io/crates/enigo
https://crates.io/crates/serde_json

下面是我的代码,自己写的只有很少,搜索"我的代码开始"即可看到,其他都是delay_timer的样板代码。

Cargo.toml

[dependencies]
delay_timer = "0.10.1"
enigo = "0.0.14"
serde_json = "1.0"
anyhow = "1.0.51"
smol = "1.2.5"

main.rs

use anyhow::Result;
use delay_timer::prelude::*;
use enigo::*;
use serde_json::{Result as SResult, Value};
use smol::Timer;
use std::fs::File;
use std::io::BufReader;
use std::thread;
use std::time::Duration;

fn main() -> Result<()> {
    let delay_timer = DelayTimerBuilder::default().build();
    // Create the task
    // A chain of task instances.
    let task_instance_chain = delay_timer
        .insert_task(build_task_async_print().unwrap())
        .unwrap();

    // Get the running instance of task 1.
    let task_instance = task_instance_chain.next_with_wait().unwrap();

    // This while loop avoids removing the task before it completes
    while task_instance.get_state() != delay_timer::prelude::instance::COMPLETED {}

    // Remove task which id is 1.
    delay_timer.remove_task(1).unwrap();
    Ok(())
}

fn build_task_async_print() -> Result<Task, TaskError> {
    let mut task_builder = TaskBuilder::default();

    let body = create_async_fn_body!({
        //我的代码开始
        let json_data = get_json().unwrap();

        for element in json_data.as_array().unwrap().iter() {
            Timer::after(Duration::from_millis(element[0].as_f64().unwrap() as u64)).await;
            println!("the value is: {}", element[0]);

            //用enigo库完成模拟按下相应键盘按键,应该怎么完成?
            let mut enigo = Enigo::new();
            enigo.key_down(Key::Layout('a'));
            thread::sleep(Duration::from_millis(element[1].as_f64().unwrap() as u64));
            enigo.key_up(Key::Layout('a'));
        }
        //我的代码结束
    });

    // Build the task and assign 1 to it
    task_builder.set_task_id(1).spawn(body)
}

//Get json data from json file
fn get_json() -> SResult<Value> {
    let file = File::open("test.json").expect("file should open read only");
    let reader = BufReader::new(file);
    let mut v: Value = serde_json::from_reader(reader)?;
    Ok(v.take())
}

问题:
用enigo库完成模拟按下相应键盘按键,应该怎么完成?上面我写了一部分,不知道怎么写了。

评论区

写评论
作者 zwl1619 2021-12-07 15:00

重叠部分,相当于两个按键同时按下。

--
👇
Bai-Jinlin: 你第一个1000毫秒开始持续800毫秒,第二个又是1500毫秒开始,什么意思

Bai-Jinlin 2021-12-07 09:07

你第一个1000毫秒开始持续800毫秒,第二个又是1500毫秒开始,什么意思

1 共 2 条评论, 1 页