如何在C#中测量系统空闲时间,不包括观看电影等时的空闲时间?
我正在寻找一个程序,衡量系统空闲时间在Windows上。我已经找到了许多这样做的代码。比如说, 但是,我还想考虑到用户观看电影、视频等的时间没有给出输入,但系统仍然没有空闲如何在C#中测量系统空闲时间,不包括观看电影等时的空闲时间?,c#,.net,windows,C#,.net,Windows,我正在寻找一个程序,衡量系统空闲时间在Windows上。我已经找到了许多这样做的代码。比如说, 但是,我还想考虑到用户观看电影、视频等的时间没有给出输入,但系统仍然没有空闲 有什么办法可以这样做吗 您可以获得计算机使用的空闲时间,但是您的问题是如何知道电影是否正在播放,您可以检查计算机上当前运行的进程System.Diagnostics.Process.getprocesss(),然后检查其中一个进程是否是已知的电影播放器。但是我认为这也不能实现你锁定的目的,因为即使你发现例如一个Gom播放器
有什么办法可以这样做吗 您可以获得计算机使用的空闲时间,但是您的问题是如何知道电影是否正在播放,您可以检查计算机上当前运行的进程
System.Diagnostics.Process.getprocesss()
,然后检查其中一个进程是否是已知的电影播放器。但是我认为这也不能实现你锁定的目的,因为即使你发现例如一个Gom播放器正在运行,你仍然不知道它是否正在运行视频或音频,或者只是在没有实际播放任何东西的情况下打开…你可以得到计算机使用的空闲时间,但是,您的问题是如何知道电影是否正在播放,您可以检查计算机上当前运行的进程System.Diagnostics.Process.getprocesss()
,然后检查其中一个进程是否是已知的电影播放器。然而,我认为这也不能实现您锁定的目的,因为即使您发现例如Gom播放器正在运行,您仍然不知道它是否正在运行视频或音频,或者只是在没有实际播放任何东西的情况下打开…如果您全屏观看视频:
您可以使用如下代码来确定是否有应用程序全屏运行:
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", SetLastError = true)]
static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
struct RECT
{
public int Left;
public int Top;
public int Width;
public int Height;
}
static bool IsBigWindowRunning()
{
foreach (Process proc in Process.GetProcesses())
{
RECT rect;
var success = GetWindowRect(proc.MainWindowHandle, out rect);
if(success && (r.Left + r.Width) >= Screen.PrimaryScreen.WorkingArea.Width)
{
return true;
}
}
return false;
}
我没有很好地测试它,我肯定会使用这条线,添加一些限制:
if((r.Left + r.Width) >= Screen.PrimaryScreen.WorkingArea.Width)
祝你好运 如果您全屏观看视频: 您可以使用如下代码来确定是否有应用程序全屏运行:
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", SetLastError = true)]
static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
struct RECT
{
public int Left;
public int Top;
public int Width;
public int Height;
}
static bool IsBigWindowRunning()
{
foreach (Process proc in Process.GetProcesses())
{
RECT rect;
var success = GetWindowRect(proc.MainWindowHandle, out rect);
if(success && (r.Left + r.Width) >= Screen.PrimaryScreen.WorkingArea.Width)
{
return true;
}
}
return false;
}
我没有很好地测试它,我肯定会使用这条线,添加一些限制:
if((r.Left + r.Width) >= Screen.PrimaryScreen.WorkingArea.Width)
祝你好运 此函数检测forground中是否有进程全屏运行,如果发现有,则返回进程名称:
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", SetLastError = true)]
static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
[DllImport("user32.dll")]
private static extern Int32 GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[DllImport("user32.dll")]
private static extern bool
GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
private struct POINTAPI
{
public int x;
public int y;
}
private struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
private struct WINDOWPLACEMENT
{
public int length;
public int flags;
public int showCmd;
public POINTAPI ptMinPosition;
public POINTAPI ptMaxPosition;
public RECT rcNormalPosition;
}
public string FullscreenProcess()
{
IntPtr foreWindow = GetForegroundWindow();
// get the placement
WINDOWPLACEMENT forePlacement = new WINDOWPLACEMENT();
forePlacement.length = Marshal.SizeOf(forePlacement);
GetWindowPlacement(foreWindow, ref forePlacement);
if (forePlacement.rcNormalPosition.top == 0 && forePlacement.rcNormalPosition.left == 0 && forePlacement.rcNormalPosition.right == Screen.PrimaryScreen.Bounds.Width && forePlacement.rcNormalPosition.bottom == Screen.PrimaryScreen.Bounds.Height)
{
uint processID;
GetWindowThreadProcessId(foreWindow, out processID);
Process proc = Process.GetProcessById((int)processID);
return proc.ProcessName;
}
return null;
}
在此之后,我们只需要将返回的进程名与一组流行媒体播放器或其他进程进行匹配
限制是我们假设用户全屏播放。此函数检测是否有一个进程在forground全屏运行,如果发现有,则返回进程名称:
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", SetLastError = true)]
static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
[DllImport("user32.dll")]
private static extern Int32 GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[DllImport("user32.dll")]
private static extern bool
GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
private struct POINTAPI
{
public int x;
public int y;
}
private struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
private struct WINDOWPLACEMENT
{
public int length;
public int flags;
public int showCmd;
public POINTAPI ptMinPosition;
public POINTAPI ptMaxPosition;
public RECT rcNormalPosition;
}
public string FullscreenProcess()
{
IntPtr foreWindow = GetForegroundWindow();
// get the placement
WINDOWPLACEMENT forePlacement = new WINDOWPLACEMENT();
forePlacement.length = Marshal.SizeOf(forePlacement);
GetWindowPlacement(foreWindow, ref forePlacement);
if (forePlacement.rcNormalPosition.top == 0 && forePlacement.rcNormalPosition.left == 0 && forePlacement.rcNormalPosition.right == Screen.PrimaryScreen.Bounds.Width && forePlacement.rcNormalPosition.bottom == Screen.PrimaryScreen.Bounds.Height)
{
uint processID;
GetWindowThreadProcessId(foreWindow, out processID);
Process proc = Process.GetProcessById((int)processID);
return proc.ProcessName;
}
return null;
}
在此之后,我们只需要将返回的进程名与一组流行媒体播放器或其他进程进行匹配
限制是我们假设用户在全屏播放。
你唯一的选择是连接到你不考虑空闲的每一个程序的API,并检查它是否在播放什么东西。你应该从对空闲时间的定义进行一个客观的定义。我只想执行一个任务,比如启动和监视一个WabCAM,当用户在一定时间内未使用系统时。您是自己尝试这样做,还是只是寻找一个已经这样做的应用程序?如果你只需要一个应用程序,你可以看看救援时间,你唯一的选择是连接API,为每个你不认为空闲的程序,并检查它是否播放一些东西。你应该先从一个客观的定义,你的空闲时间意味着什么。我只是想执行一个任务,比如启动和监控WabCAM,当用户在一定时间内未使用系统时。您是自己尝试这样做,还是只是寻找一个已经这样做的应用程序?如果你只是想要一个应用程序,你可以看看rescuetime,没错。一定有办法通过API实现这一点,因为windows本身能够检测时间(因为如果你在看电影,电脑屏幕不会关闭)。在某些电影播放器中,即使正在播放电影,屏幕服务器也会工作,很多电影播放器在播放时添加了一个选项来抑制屏幕服务器。@Shashank:例如,Gom播放器提供了一个复选框选项在播放时禁用屏幕服务器
,因此电影播放器本身可能通过一些api来阻止屏幕服务器。我还想说,检测到它的不是windows。如果我要编程一个播放器,我会添加一个选项,在移动运行时禁用屏幕保护程序……即使是由媒体播放器完成的,他们是如何做到的?如果他们正在重置一些变量,我们可能能够检测到。没错。一定有办法通过API实现这一点,因为windows本身能够检测时间(因为如果你在看电影,电脑屏幕不会关闭)。在某些电影播放器中,即使正在播放电影,屏幕服务器也会工作,很多电影播放器在播放时添加了一个选项来抑制屏幕服务器。@Shashank:例如,Gom播放器提供了一个复选框选项在播放时禁用屏幕服务器
,因此电影播放器本身可能通过一些api来阻止屏幕服务器。我还想说,检测到它的不是windows。如果我要编程一个播放器,我会添加一个选项,在移动运行时禁用屏幕保护程序……即使是由媒体播放器完成的,他们是如何做到的?如果他们正在重置一些变量,我们可能能够检测到。很好的建议。我也来试试。将在这里分享我的经验。如果这个程序正确检测到全屏应用程序,我们可能会得到答案。如果一个应用程序正在全屏运行,我们会得到它的进程名,并与流行媒体播放器的名称匹配。如果找到匹配项,则表示媒体播放器正在全屏播放视频。所以,在很大程度上,它解决了问题。很好的建议。我也来试试。将在这里分享我的经验。如果这个程序正确检测到全屏应用程序,我们可能会得到答案。如果一个应用程序正在全屏运行,我们会得到它的进程名,并与流行媒体播放器的名称匹配。如果找到匹配项,则表示媒体播放器正在全屏播放视频。因此,在很大程度上,它解决了这个问题。