zoukankan      html  css  js  c++  java
  • 系统要关闭,可我程序还有事要处理?

    系统要关闭,可我程序还有事要处理?

    问题1描述:

      运行了一个客户端程序,服务端表明客户端在线,突然运行客户端程序的电脑关机了,但服务端并不知道客户端下线了,服务端的状态并不能及时更新为下线.

    解决方法:

      通过截获系统的关闭消息,在系统关闭前对程序进行必要的处理.

      系统在关闭(关机/重启/注销)之前会向每个当前正在运行的应用程序发送WM_QUERYENDSESSION消息,询问系统能否关闭,系统再向应用程序发送WM_ENDSESSION消息,根据WM_QUERYENDSESSION消息的返回结果,从而通知应用程序是否已经结束.

      所以我们可以截获:WM_QUERYENDSESSION消息,在此消息中对程序进行必要的处理,处理成功后返回TRUE,表示此程序已经结束,系统可以关闭.

    问题2描述:

      通过截获系统的关闭消息,在系统关闭前,可以成功对程序进行必要的处理.但是往往多个程序之间是有关联的,比如问题1的客户端程序系统关闭前会向服务端发送下线消息,但这时在对客户端程序进行关闭时客户端程序处理时,有可能电脑的网络已经断开,或者通过代理软件连网的软件已经断开,可想而知,客户端程序在断网前没有成功发送消息给服务端。

    解决方法:

        在系统关闭期间,可以为指定的程序设置相对于其它程序的关闭顺序。

        SetProcessShutdownParmeters(Ox04FF,SHUNDOWN_NORETRY);


    附MSDN消息解释:


    WM_ENDSESSION


    The WM_ENDSESSION message is sent to an application after the system processes the results of the WM_QUERYENDSESSION message. The WM_ENDSESSION message informs the application whether the session is ending.
    A window receives this message through its WindowProc function.
    LRESULT CALLBACK WindowProc(
      HWND hwnd,       // handle to window
      UINT uMsg,       // message identifier
      WPARAM wParam,   // end-session option
      LPARAM lParam    // logoff option
    );
    Parameters
    hwnd 
    Handle to window. 
    uMsg 
    WM_ENDSESSION identifier. 
    wParam 
    If the session is being ended, this parameter is TRUE; otherwise, it is FALSE. (表示是否要终止程序,如果是TRUE,指令该程序终止,否则是FALSE)
    lParam 
    If this parameter includes ENDSESSION_LOGOFF, the user is logging off; otherwise, the user is shutting down the system. (Note that this parameter is a bit mask. To test for this value, use a bit-wise operation; do not test for equality.) (表示用户注销还是系统被关闭。如果此参数包含ENDSESSION_LOGOFF,则表示系统注销。)
    If this parameter is zero, the system is shutting down.
    Return Values
    If an application processes this message, it should return zero.

    WM_QUERYENDSESSION


    The WM_QUERYENDSESSION message is sent when the user chooses to end the session or when an application calls the ExitWindows function. If any application returns zero, the session is not ended. The system stops sending WM_QUERYENDSESSION messages as soon as one application returns zero.
    After processing this message, the system sends the WM_ENDSESSION message with the wParam parameter set to the results of the WM_QUERYENDSESSION message.
    A window receives this message through its WindowProc function.
    LRESULT CALLBACK WindowProc(
      HWND hwnd,       // handle to window
      UINT uMsg,       // message identifier
      WPARAM wParam,   // not used
      LPARAM lParam    // logoff option
    );
    Parameters
    hwnd 
    Handle to window. 
    uMsg 
    WM_QUERYENDSESSION identifier. 
    wParam 
    This parameter is reserved for future use. 
    lParam 
    If this parameter includes ENDSESSION_LOGOFF, the user is logging off. (Note that this parameter is a bit mask. To test for this value, use a bit-wise operation; do not test for equality.) 
    If this parameter is zero, the system is shutting down or restarting (it is not possible to determine which event is occurring). 
    Return Values
    If an application can terminate conveniently, it should return TRUE; otherwise, it should return FALSE.

    SetProcessShutdownParameters

    The SetProcessShutdownParameters function sets shutdown parameters for the currently calling process. This function sets a shutdown order for a process relative to the other processes in the system.
    BOOL SetProcessShutdownParameters(
      DWORD dwLevel,
      DWORD dwFlags
    );
    Parameters
    dwLevel 
    [in] Shutdown priority for a process relative to other processes in the system. The system shuts down processes from high dwLevel values to low. The highest and lowest shutdown priorities are reserved for system components. This parameter must be in the following range of values. Value Meaning 
    000-0FF System reserved last shutdown range. 
    100-1FF Application reserved last shutdown range. 
    200-2FF Application reserved "in between" shutdown range. 
    300-3FF Application reserved first shutdown range. 
    400-4FF System reserved first shutdown range. 
    All processes start at shutdown level 0x280.
    dwFlags 
    [in] Flags. This parameter can be the following value. Value Meaning 
    SHUTDOWN_NORETRY
    0x00000001 The system terminates the process without displaying a retry dialog box for the user. 
    Return Values
    If the function is succeeds, the return value is nonzero.

  • 相关阅读:
    Android 仿淘宝头条竖直跑马灯式新闻标题及“分页思想
    Android setOnPageChangeListener 过时了怎么办?
    Android requestWindowFeature(Window.FEATURE_NO_TITLE)无效解决方法
    Android ViewPager+HorizontalScrollView实现标题栏滑动(腾讯新闻)
    Android OKHttp网络框架
    安卓开发常用网络请求框架OkHttp、Volley、XUtils、Retrofit对比
    Android 修改源码自定义SwipeRefreshLayout样式——高仿微信朋友圈下拉刷新
    Android 比SwipeRefreshLayout更漂亮和强大的下拉刷新控件:Android-MaterialRefreshLayout
    Android Error:Unable to find method 'com.android.build.gradle.api.BaseVariant.getOutputs()Ljava/util/List;'.
    Android 浅谈 RxAndroid + Retrofit + Databinding
  • 原文地址:https://www.cnblogs.com/Dageking/p/2979314.html
Copyright © 2011-2022 走看看