表达C#条件,"如果在最后'n'秒内没有发生鼠标/键盘动作"

use*_*478 4 c# events conditional winforms

问题是如何让C#程序(在Windows中运行)在过去的一段时间内检查是否按下了一个键按钮,或者鼠标是否已被移动/点击.

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

另外,有一种方法可以从条件中排除某些事件(即键"Z").

Luc*_*ski 5

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);
}
Run Code Online (Sandbox Code Playgroud)

相关的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;
}
Run Code Online (Sandbox Code Playgroud)

  • 那个回报声明真是太过分了.当分子为零时,避免分割为40个字符. (2认同)