经常保持与服务器的联系,一旦联系中断立刻自动退出阅读器并提示
解决方案:
NetworkChange 类通过引发 NetworkAddressChanged 事件来提供地址更改通知。 接口地址可能因许多原因而更改,如网线断开连接、移出了无线局域网的范围,或者硬件故障。
若要收到通知,必须确定应用程序的事件处理程序(每次引发事件时执行应用程序特定任务的一个或多个方法)。若要使 NetworkChange 对象在 NetworkAddressChanged 事件发生时调用事件处理方法,必须将方法与 NetworkAddressChangedEventHandler 委托关联并将该委托添加到事件中。
其中 NetworkInterface 类封装本地计算机上的网络接口(也称作适配器)的数据。不需创建此类的
实例; GetAllNetworkInterfaces 方法返回一个数组,对于本地计算机上的每个网络接口,该数组中都包含一个此类的实例。
// This is how you can determine whether a socket is still connected.
bool blockingState = serverStr.Blocking;
try
{
byte[] tmp = new byte[1];
serverFile.Blocking = false;
serverFile.Send(tmp);
}
catch (SocketException e)
{
// 10035 == WSAEWOULDBLOCK
if (e.NativeErrorCode.Equals(10035))
{ }
else
{
exitSystem();
}
}
finally
{
serverFile.Blocking = blockingState;
}
注意:Socket.Connected 属性获取截止到最后的 I/O 操作时 Socket 的连接状态。 当它返回 false 时,表明 Socket 要么从未连接,要么已断开连接。Connected 属性的值反映最近操作时的连接状态。 如果您需要确定连接的当前状态,请进行非阻止、零字节的 Send 调用。如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035),则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。如果调用用户数据报协议 (UDP) 套接字上的 Connect,则 Connected 属性始终返回 true;不过,此操作不更改 UDP 的内在无连接特性。
一旦阅读器整体失去焦点,自动最小化
解决方案:
Form.ActiveForm 属性获取此应用程序的当前活动窗体。
命名空间: System.Windows.Forms
程序集: System.Windows.Forms(在 System.Windows.Forms.dll 中)
属性值
类型: System.Windows.Forms.Form
Form,表示当前活动窗体,或者如果没有活动窗体,则为 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing)。
备注可以使用此方法获得对当前活动窗体的引用,以在该窗体或其控件上执行操作。如果应用程序是多文档界面 (MDI) 应用程序,请使用 ActiveMdiChild 属性获得当前活动的 MDI 子窗体。
时刻监控 U 盘的状态,一旦被拔出,阅读器自动退出;
解决方案:
重载 WndProc, 监听 WM_DEVICECHANGE 事件. 重载函数如下:
protected override void WndProc(ref System.Windows.Forms.Message m)
10分钟阅读器没有任何操作,自动退出
解决方案:
现在实现的是用户对包括阅读器在内的所有程序没有任何操作达到 10 分钟则自动退出
[StructLayout(LayoutKind.Sequential)]
struct LASTINPUTINFO
{
[MarshalAs(UnmanagedType.U4)]
public int cbSize;
[MarshalAs(UnmanagedType.U4)]
public uint dwTime;
}
[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LASTINPUTINFO inputInfo);
static long GetLastInputTime()
{
LASTINPUTINFO vInputInfo = new LASTINPUTINFO();
vInputInfo.cbSize = Marshal.SizeOf(vInputInfo);
if (!GetLastInputInfo(ref vInputInfo))
return 0;
return Environment.TickCount - vInputInfo.dwTime;
}
private void timerNoInput_Tick(object sender, EventArgs e)
{
const long lExitTime = 600000;
long lLastInputTime = 0;
lLastInputTime = GetLastInputTime();
if (lLastInputTime >= lExitTime)
{
exitSystem();
}
if (lLastInputTime < lExitTime)
{
timerNoInput.Interval = Convert.ToInt32(lExitTime - lLastInputTime);
}
}
这个问题有更好的方案,可以在 CodeProject 中找到源码。