winshutdownmonitor.h raw

   1  // Copyright (c) 2014-2021 The Limenka developers
   2  // Distributed under the MIT software license, see the accompanying
   3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
   4  
   5  #ifndef LIMENKA_QT_WINSHUTDOWNMONITOR_H
   6  #define LIMENKA_QT_WINSHUTDOWNMONITOR_H
   7  
   8  #ifdef WIN32
   9  #include <QByteArray>
  10  #include <QString>
  11  #include <functional>
  12  
  13  #include <windows.h>
  14  
  15  #include <QAbstractNativeEventFilter>
  16  
  17  class WinShutdownMonitor : public QAbstractNativeEventFilter
  18  {
  19  public:
  20      WinShutdownMonitor(std::function<void()> shutdown_fn) : m_shutdown_fn{std::move(shutdown_fn)} {}
  21  
  22      /** Implements QAbstractNativeEventFilter interface for processing Windows messages */
  23  #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
  24      bool nativeEventFilter(const QByteArray &eventType, void *pMessage, qintptr *pnResult) override;
  25  #else
  26      bool nativeEventFilter(const QByteArray &eventType, void *pMessage, long *pnResult) override;
  27  #endif
  28  
  29      /** Register the reason for blocking shutdown on Windows to allow clean client exit */
  30      static void registerShutdownBlockReason(const QString& strReason, const HWND& mainWinId);
  31  
  32  private:
  33      std::function<void()> m_shutdown_fn;
  34  };
  35  #endif
  36  
  37  #endif // LIMENKA_QT_WINSHUTDOWNMONITOR_H
  38