winshutdownmonitor.cpp
1 // Copyright (c) 2014-present The Bitcoin Core 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 #include <qt/winshutdownmonitor.h> 6 7 #if defined(Q_OS_WIN) 8 9 #include <windows.h> 10 11 #include <QDebug> 12 13 // If we don't want a message to be processed by Qt, return true and set result to 14 // the value that the window procedure should return. Otherwise return false. 15 bool WinShutdownMonitor::nativeEventFilter(const QByteArray &eventType, void *pMessage, qintptr *pnResult) 16 { 17 Q_UNUSED(eventType); 18 19 MSG *pMsg = static_cast<MSG *>(pMessage); 20 21 switch(pMsg->message) 22 { 23 case WM_QUERYENDSESSION: 24 { 25 // Initiate a client shutdown after receiving a WM_QUERYENDSESSION and block 26 // Windows session end until we have finished client shutdown. 27 m_shutdown_fn(); 28 *pnResult = FALSE; 29 return true; 30 } 31 32 case WM_ENDSESSION: 33 { 34 *pnResult = FALSE; 35 return true; 36 } 37 } 38 39 return false; 40 } 41 42 void WinShutdownMonitor::registerShutdownBlockReason(const QString& strReason, const HWND& mainWinId) 43 { 44 typedef BOOL (WINAPI *PSHUTDOWNBRCREATE)(HWND, LPCWSTR); 45 PSHUTDOWNBRCREATE shutdownBRCreate = (PSHUTDOWNBRCREATE)(void*)GetProcAddress(GetModuleHandleA("User32.dll"), "ShutdownBlockReasonCreate"); 46 if (shutdownBRCreate == nullptr) { 47 qWarning() << "registerShutdownBlockReason: GetProcAddress for ShutdownBlockReasonCreate failed"; 48 return; 49 } 50 51 if (shutdownBRCreate(mainWinId, strReason.toStdWString().c_str())) 52 qInfo() << "registerShutdownBlockReason: Successfully registered: " + strReason; 53 else 54 qWarning() << "registerShutdownBlockReason: Failed to register: " + strReason; 55 } 56 #endif