检测本地网络连接状态断开以及恢复的方法

 在很多应用程序中,比如qq,msn等im软件,需要时刻知道自己当前是否处于联机状态,在网络连接不通时将状态置为离线,而在网络连接恢复时重新连接到服务器.如果是im类的软件,一般都需要保持与服务器的心跳连接,以便服务器在一定的超时时间之后将客户端踢下线,以节省资源.对于通过定时器检测网络错误或者服务器down机的错误,这是很简单的任务,只要自己指定一个阈值,超过这个阈值都没有收到心跳的回包,就可以认为网络已经断开了.
    今天要讨论的是检测本地网络连接的状态改变,例如禁用/启用网络连接,拔出/插入网线等.我最初的想法是这些都属于硬件信息的改动,操作系统应该会有消息发送给应用程序,就跟插入u盘一样样的.但后来的实践发现这个行不通,我们的程序只能收到最最概括的一个硬件信息改动消息.虽然没有事件通知,不过对于网络断开还是很好检测到的,因为此时操作系统会关闭所有的tcp连接,只要你的程序有tcp连接,那你就能在socket的OnClose函数里面处理断开事件.而网络的恢复就没那么容易了,幸好这时候还有IsNetworkAlive函数能帮我们了.当网络连接断开时,我们启动一个定时器,不断调用该函数,如果检测到本地网络由断开到恢复时,就可以立即重新连接了.
    另外,据说我们还能通过注册wmi事件的方式来捕捉这些改动,因为之前没用过,还没试过,下次有空试试.
    -------------------我是一条分割线,割割更健康---------------------
    记一笔如何让一个窗口永远停在屏幕最上方,且一直拥有输入焦点.停在最前方,只要Z_Order是topmost就行,而要拥有输入焦点,则要在wm_active的消息处理中做点手脚.不过不能立即在里面直接设置自己的窗口为活动窗口,因为操作系统会在你处理完你自己的wm_active消息后,会再将下一个窗口设置为活动窗口,他可不会理会你自封的活动窗口.这时候你需要先冷静一会,不要和操作系统抢,等几个毫秒,再设置自己的就可以了.
原文地址:https://www.cnblogs.com/hzcya1995/p/13318276.html