diff --git a/CHANGELOG.md b/CHANGELOG.md
index 84c313a4ac..c224ee94b8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
- added "LingerExemptWnds=n" to make the lingering process monitor mechanism no longer exempt lingering processes with windows from termination
- Added option 'SharedTemplate' to Box Wizard [#3737](https://github.com/sandboxie-plus/Sandboxie/pull/3737) (thanks offhub)
- Added an option to force the protection of an encrypted sandbox to be enabled. [#3736](https://github.com/sandboxie-plus/Sandboxie/pull/3736) (thanks Yeyixiao)
+- Added a menu and button/icon to suspend all processes [#3741] (https://github.com/sandboxie-plus/Sandboxie/issues/3741)
### Changed
- option "LingerLeniency=n" now also disabled the 5 sec grace period for freshly started lingerers [#1892](https://github.com/sandboxie-plus/Sandboxie/issues/1892)
diff --git a/SandboxiePlus/SandMan/Resources/Actions/Pause.png b/SandboxiePlus/SandMan/Resources/Actions/Pause.png
new file mode 100644
index 0000000000..6f8889a63c
Binary files /dev/null and b/SandboxiePlus/SandMan/Resources/Actions/Pause.png differ
diff --git a/SandboxiePlus/SandMan/Resources/SandMan.qrc b/SandboxiePlus/SandMan/Resources/SandMan.qrc
index 7de8decbb6..acf7546b21 100644
--- a/SandboxiePlus/SandMan/Resources/SandMan.qrc
+++ b/SandboxiePlus/SandMan/Resources/SandMan.qrc
@@ -181,6 +181,7 @@
SideLogoDM.png
Actions/TaskBar.png
Actions/Desktop.png
+ Actions/Pause.png
Boxes/BusyOverlay.png
diff --git a/SandboxiePlus/SandMan/SandMan.cpp b/SandboxiePlus/SandMan/SandMan.cpp
index 3ad2037c21..755ca75751 100644
--- a/SandboxiePlus/SandMan/SandMan.cpp
+++ b/SandboxiePlus/SandMan/SandMan.cpp
@@ -510,6 +510,7 @@ void CSandMan::CreateMenus(bool bAdvanced)
m_pImportBox->setEnabled(CArchive::IsInit());
m_pMenuFile->addSeparator();
m_pRunBoxed = m_pMenuFile->addAction(CSandMan::GetIcon("Run"), tr("Run Sandboxed"), this, SLOT(OnSandBoxAction()));
+ m_pPauseAll = m_pMenuFile->addAction(CSandMan::GetIcon("Pause"), tr("Suspend All Processes"), this, SLOT(OnPauseAll()));
m_pEmptyAll = m_pMenuFile->addAction(CSandMan::GetIcon("EmptyAll"), tr("Terminate All Processes"), this, SLOT(OnEmptyAll()));
m_pLockAll = m_pMenuFile->addAction(CSandMan::GetIcon("LockClosed"), tr("Lock All Encrypted Boxes"), this, SLOT(OnLockAll()));
m_pMenuFile->addSeparator();
@@ -653,6 +654,7 @@ void CSandMan::CreateOldMenus()
m_pMenuFile = m_pMenuBar->addMenu(tr("&File"));
m_pRunBoxed = m_pMenuFile->addAction(CSandMan::GetIcon("Run"), tr("Run Sandboxed"), this, SLOT(OnSandBoxAction()));
+ m_pPauseAll = m_pMenuFile->addAction(CSandMan::GetIcon("Pause"), tr("Suspend All Processes"), this, SLOT(OnPauseAll()));
m_pEmptyAll = m_pMenuFile->addAction(CSandMan::GetIcon("EmptyAll"), tr("Terminate All Processes"), this, SLOT(OnEmptyAll()));
m_pLockAll = m_pMenuFile->addAction(CSandMan::GetIcon("LockClosed"), tr("Lock All Encrypted Boxes"), this, SLOT(OnLockAll()));
m_pDisableForce = m_pMenuFile->addAction(CSandMan::GetIcon("PauseForce"), tr("Pause Forcing Programs"), this, SLOT(OnDisableForce()));
@@ -830,6 +832,7 @@ QList CSandMan::GetAvailableToolBarActions()
ToolBarAction{ "", nullptr }, // separator
ToolBarAction{ "RunBoxed", m_pRunBoxed },
ToolBarAction{ "IsBoxed", m_pWndFinder },
+ ToolBarAction{ "SuspendAll", m_pPauseAll },
ToolBarAction{ "TerminateAll", m_pEmptyAll },
ToolBarAction{ "LockAll", m_pLockAll },
ToolBarAction{ "", nullptr }, // separator
@@ -2577,6 +2580,7 @@ void CSandMan::UpdateState()
m_pNewBox->setEnabled(isConnected);
m_pNewGroup->setEnabled(isConnected);
m_pImportBox->setEnabled(isConnected);
+ m_pPauseAll->setEnabled(isConnected);
m_pEmptyAll->setEnabled(isConnected);
m_pLockAll->setEnabled(isConnected);
m_pDisableForce->setEnabled(isConnected);
@@ -3184,6 +3188,15 @@ void CSandMan::OnEmptyAll()
theAPI->TerminateAll();
}
+void CSandMan::OnPauseAll()
+{
+ for (auto pBox: theAPI->GetAllBoxes()) {
+ pBox->SetSuspendedAll(TRUE);
+ for (auto pProcess : pBox->GetProcessList())
+ pProcess->TestSuspended();
+ }
+}
+
void CSandMan::OnLockAll()
{
if (theConf->GetInt("Options/WarnLockAll", -1) == -1)
diff --git a/SandboxiePlus/SandMan/SandMan.h b/SandboxiePlus/SandMan/SandMan.h
index d7af590d8f..612a47b69f 100644
--- a/SandboxiePlus/SandMan/SandMan.h
+++ b/SandboxiePlus/SandMan/SandMan.h
@@ -251,6 +251,7 @@ private slots:
void OnSandBoxAction();
void OnSettingsAction();
+ void OnPauseAll();
void OnEmptyAll();
void OnLockAll();
void OnWndFinder();
@@ -373,6 +374,7 @@ private slots:
QAction* m_pNewBox;
QAction* m_pNewGroup;
QAction* m_pImportBox;
+ QAction* m_pPauseAll;
QAction* m_pEmptyAll;
QAction* m_pLockAll;
QAction* m_pWndFinder;