表达C#条件;如果在最后';n';秒”;

本文关键字:条件 如果 表达 最后 | 更新日期: 2023-09-27 18:21:44

问题是如何让C#程序(在Windows中运行)检查在过去设定的时间内是否按下了按键或移动/单击了鼠标。

我发现的一个解决方案使用"KeyPress"事件,但只有当控件(或应用程序)有焦点时,这才有效。我正在寻找一个即使程序在后台运行也能正常工作的解决方案。

此外,最好有一种方法将某些事件(即键"Z")从条件中排除。

表达C#条件;如果在最后';n';秒”;

WinAPI中有一个函数正是这样做的:GetLastInputInfo。

此功能对于输入空闲检测非常有用。但是,GetLastInputInfo并没有在所有正在运行的会话中提供系统范围的用户输入信息。相反,GetLastInputInfo只为调用函数的会话提供特定于会话的用户输入信息。

pinvoke.net上甚至有一个例子。这是我的版本:

public static TimeSpan GetIdleTime()
{
    var lastInputInfo = new LASTINPUTINFO
    {
        cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO))
    };
    if (!GetLastInputInfo(ref lastInputInfo))
        throw new Win32Exception("GetLastInputInfo failed");
    return TimeSpan.FromMilliseconds(Environment.TickCount - lastInputInfo.dwTime);
}

相关p/Invoke定义:

[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
[StructLayout(LayoutKind.Sequential)]
struct LASTINPUTINFO
{
    [MarshalAs(UnmanagedType.U4)]
    public UInt32 cbSize;
    [MarshalAs(UnmanagedType.U4)]
    public UInt32 dwTime;
}