未正确检测生 rust winapi GetLastInputInfo

oxiaedzo  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(170)

我对rust很陌生,也是一个真正的编程新手。我正在写一个rust程序,它会检测空闲状态,并打印出上次输入后的时间。我使用的是winapi crate。下面的代码返回的值在0 ns到31 ms之间,无论我按下一个键或移动鼠标的时间有多长。它从来没有超过31 ms。

use winapi::um::{
    winuser::{
        LASTINPUTINFO,
        PLASTINPUTINFO,
        GetLastInputInfo
    },
};

fn sleep(milliseconds: u64){
    let mills = std::time::Duration::from_millis(milliseconds);
    std::thread::sleep(mills);
}

fn main() {
    loop {
        let now = unsafe { winapi::um::sysinfoapi::GetTickCount() };
        let mut last_input_info = LASTINPUTINFO {
            cbSize: std::mem::size_of::<LASTINPUTINFO>() as u32,
            dwTime: 0
        };

        let p_last_input_info: PLASTINPUTINFO = &mut last_input_info as *mut LASTINPUTINFO;

        let ok = unsafe { GetLastInputInfo(p_last_input_info) } != 0;

        let logvar = match ok {
            true => {
                let millis = now - last_input_info.dwTime;
                Ok(std::time::Duration::from_millis(millis as u64))
            },
            false => Err(format!("GetLastInputInfo failed"))
        }.unwrap();

        println!("{:?}", logvar);
        sleep(1000);
    };
}

我认为可能是某个程序阻止了电脑进入空闲状态,所以使用powercfg -requests,我发现一些音频流打开了(仍然不知道如何修复)。我只是不知道这是否是这里发生的事情。请求社区Maven!

1yjd4xko

1yjd4xko1#

执行下面的cpp代码可能对检查问题有好处。它在我的电脑上运行得很好。

  • 如果运行良好--〉您的Rust代码或Rust winapi问题
  • 如果它不能很好地工作--〉您的PC问题
#include <windows.h>

int main() {
    LASTINPUTINFO   lii;
    lii.cbSize = sizeof(LASTINPUTINFO);

    for (;;) {
        int ret = GetLastInputInfo(&lii);
        printf("ret=%d diff=%d\n", ret, GetTickCount() - lii.dwTime);
        Sleep(1000);
    }
}

使用鼠标移动和停止在我PC中输出

ret=1 diff=578
ret=1 diff=1578
ret=1 diff=2594
ret=1 diff=0
ret=1 diff=422
ret=1 diff=1422
ret=1 diff=2422
ret=1 diff=3438
ret=1 diff=4438
ret=1 diff=5438
ret=1 diff=79
ret=1 diff=16
pbpqsu0x

pbpqsu0x2#

我已经找到了罪魁祸首。根本不是生 rust 的代码,而是我的游戏控制器驱动程序注册为输入。出于某种原因,每当我连接游戏控制器时,它就会这样做。我花了很长时间才弄明白,即使如此,在谷歌搜索了几周后,我还是偶然发现了答案。这个问题就这么结束了。

相关问题