c# 的实现的一些简单功能

经常保持与服务器的联系,一旦联系中断立刻自动退出阅读器并提示
解决方案:
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 中找到源码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值