这里有个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库完成模拟按下相应键盘按键,应该怎么完成?上面我写了一部分,不知道怎么写了。
1
共 2 条评论, 1 页
评论区
写评论重叠部分,相当于两个按键同时按下。
--
👇
Bai-Jinlin: 你第一个1000毫秒开始持续800毫秒,第二个又是1500毫秒开始,什么意思
你第一个1000毫秒开始持续800毫秒,第二个又是1500毫秒开始,什么意思