我有一个应用程序,它每2分钟进行一次网络连接。该应用程序不是Windows服务,它是在当前Windows用户的上下文下运行的。
如果Windows进入睡眠模式,然后醒来(以便显示Windows登录屏幕),我稍后会在日志中看到,我的应用程序进行的任何连接尝试都会失败,并显示"无法解析远程名称"WebException。此错误发生在登录屏幕处于活动状态期间。后来,当用户登录时,他们看到我的应用程序抱怨"发生了错误"。
是否在某个地方记录了(如果后台应用程序是在用户的上下文下执行的,该用户在该计算机上有打开的会话,但当前该会话已锁定)?我能在我的C#应用程序中检测到这种情况吗(如果登录屏幕处于活动状态,就不要尝试访问网络)?
此外,也许还有更多类似的情况我应该处理?我的意思是,也许我不应该检查登录屏幕是否处于活动状态,也许有一种更通用的方法,比如WinAPI函数,它只是"告诉"我Windows是否处于允许我访问网络之类的状态。
同时,我不想只使用"网络可用"功能,因为它无法让我了解是否根本没有网络(这对我的应用程序来说是错误的),或者只是因为计算机被锁定或其他原因而导致网络现在不可用(没有错误,我只是应该稍后重试)。
我正在64位Windows 7 SP1上测试这一点,但我怀疑这种行为在所有版本中都是一致的,我需要找到优雅处理它的方法。
要阻止应用程序尝试访问网络,请查看SystemEvents.SessionSwitch
。
如果将事件处理程序挂接到该事件处理程序,则每次会话更改时都会触发一个事件。事件参数的属性将告诉您会话是否被锁定/解锁。然后,您可以根据需要停止/启动网络访问。
例如:
private void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
if (e.Reason == SessionSwitchReason.SessionLock)
{
// session was locked
}
else if (e.Reason == SessionSwitchReason.SessionUnlock)
{
// session was unlocked
}
}
还有一些其他原因也可以处理:
- 用于远程桌面连接的
RemoteConnect
/RemoteDisconnect
ConsoleConnect
/ConsoleDisconnect
,用于直接连接到控制台的远程桌面(mstsc /console
)