表达C#条件;如果在最后';n';秒”;
本文关键字:条件 如果 表达 最后 | 更新日期: 2023-09-27 18:21:44
问题是如何让C#程序(在Windows中运行)检查在过去设定的时间内是否按下了按键或移动/单击了鼠标。
我发现的一个解决方案使用"KeyPress"事件,但只有当控件(或应用程序)有焦点时,这才有效。我正在寻找一个即使程序在后台运行也能正常工作的解决方案。
此外,最好有一种方法将某些事件(即键"Z")从条件中排除。
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;
}