From c1205fd043d4b77b2c2e4d7da24c0f039111ac4b Mon Sep 17 00:00:00 2001 From: love-code-yeyixiao <188240888@qq.com> Date: Tue, 16 Jul 2024 12:15:03 +0800 Subject: [PATCH 1/3] OpenFile Shell --- SandboxiePlus/QSbieAPI/SbieUtils.cpp | 37 ++++++++++++++++++++++++++++ SandboxiePlus/QSbieAPI/SbieUtils.h | 4 +++ SandboxiePlus/SandMan/SandMan.cpp | 20 ++++++++++++++- SandboxiePlus/SandMan/main.cpp | 19 +++++++++++--- 4 files changed, 76 insertions(+), 4 deletions(-) diff --git a/SandboxiePlus/QSbieAPI/SbieUtils.cpp b/SandboxiePlus/QSbieAPI/SbieUtils.cpp index 5f389338..f48c553c 100644 --- a/SandboxiePlus/QSbieAPI/SbieUtils.cpp +++ b/SandboxiePlus/QSbieAPI/SbieUtils.cpp @@ -523,6 +523,43 @@ void CSbieUtils::RemoveContextMenu3() RegDeleteTreeW(HKEY_CURRENT_USER, L"software\\classes\\folder\\shell\\addforce"); } + +bool CSbieUtils::HasContextMenu4() +{ + const wchar_t* key = L"Software\\Classes\\*\\shell\\addopen\\command"; + //const wchar_t* key2 = L"Software\\Classes\\*\\Folder\\addforce\\command"; + HKEY hkey, hKey2; + LONG rc = RegOpenKeyEx(HKEY_CURRENT_USER, key, 0, KEY_READ, &hkey); + if (rc != 0) + return false; + + RegCloseKey(hkey); + + + /*rc = RegOpenKeyEx(HKEY_CURRENT_USER, key2, 0, KEY_READ, &hkey2); + if (rc != 0) + return false; + + RegCloseKey(hkey2);*/ + + return true; +} + +void CSbieUtils::AddContextMenu4(const QString& StartPath, const QString& RunStr, const QString& IconPath) +{ + std::wstring start_path = L"\"" + StartPath.toStdWString() + L"\""; + std::wstring icon_path = L"\"" + (IconPath.isEmpty() ? StartPath : IconPath).toStdWString() + L"\""; + + CreateShellEntry(L"*", L"addopen", RunStr.toStdWString(), icon_path, start_path + L" /add_open \"%1\" %*"); + CreateShellEntry(L"Folder", L"addopen", RunStr.toStdWString(), icon_path, start_path + L" /add_open \"%1\" %*"); +} + +void CSbieUtils::RemoveContextMenu4() +{ + RegDeleteTreeW(HKEY_CURRENT_USER, L"software\\classes\\*\\shell\\addopen"); + RegDeleteTreeW(HKEY_CURRENT_USER, L"software\\classes\\folder\\shell\\addopen"); +} + ////////////////////////////////////////////////////////////////////////////// // Shortcuts diff --git a/SandboxiePlus/QSbieAPI/SbieUtils.h b/SandboxiePlus/QSbieAPI/SbieUtils.h index c3e858f7..7fa44001 100644 --- a/SandboxiePlus/QSbieAPI/SbieUtils.h +++ b/SandboxiePlus/QSbieAPI/SbieUtils.h @@ -40,6 +40,10 @@ public: static void AddContextMenu3(const QString& StartPath, const QString& RunStr, const QString& IconPath = QString()); static void RemoveContextMenu3(); + static bool HasContextMenu4(); + static void AddContextMenu4(const QString& StartPath, const QString& RunStr, const QString& IconPath = QString()); + static void RemoveContextMenu4(); + static bool CreateShortcut(const QString& StartExe, QString LinkPath, const QString &LinkName, const QString &boxname, const QString &arguments, const QString &iconPath = QString(), int iconIndex = 0, const QString &workdir = QString(), bool bRunElevated = false); static bool GetStartMenuShortcut(class CSbieAPI* pApi, QString &BoxName, QString &LinkPath, QString &IconPath, quint32& IconIndex, QString &WorkDir); diff --git a/SandboxiePlus/SandMan/SandMan.cpp b/SandboxiePlus/SandMan/SandMan.cpp index fc68adc8..5cce4fa3 100644 --- a/SandboxiePlus/SandMan/SandMan.cpp +++ b/SandboxiePlus/SandMan/SandMan.cpp @@ -1636,7 +1636,7 @@ void CSandMan::OnMessage(const QString& MsgData) setWindowState(Qt::WindowActive); SetForegroundWindow(MainWndHandle); } - else if (Message.left(4) == "Add:") + else if (Message.left(9) == "AddForce:") { @@ -1660,6 +1660,24 @@ void CSandMan::OnMessage(const QString& MsgData) QMessageBox::warning(g_GUIParent, tr("Sandboxie-Plus Warning"), tr("Users canceled this operation."), QMessageBox::Yes, 0); } } + else if (Message.left(8) == "AddOpen:") + { + + + QString respone = QInputDialog::getText(g_GUIParent, tr("Which box you want to add in?"), tr("Type the box name which you are going to set:")); + if (!respone.isEmpty()) + { + if (theAPI->GetBoxByName(respone) != NULL) { + theAPI->GetBoxByName(respone)->AppendText("OpenFilePath", Message.mid(4).replace("\"", "")); + } + else { + QMessageBox::warning(g_GUIParent, tr("Sandboxie-Plus Warning"), tr("You typed a wrong box name!Nothing was changed."), QMessageBox::Ok, 0); + } + } + else { + QMessageBox::warning(g_GUIParent, tr("Sandboxie-Plus Warning"), tr("Users canceled this operation."), QMessageBox::Yes, 0); + } + } else if (Message.left(4) == "Run:") { QString BoxName; diff --git a/SandboxiePlus/SandMan/main.cpp b/SandboxiePlus/SandMan/main.cpp index 6d1f88c2..5f53b6d2 100644 --- a/SandboxiePlus/SandMan/main.cpp +++ b/SandboxiePlus/SandMan/main.cpp @@ -112,14 +112,20 @@ int main(int argc, char *argv[]) } int DfpPos = Args.indexOf("/disable_force", Qt::CaseInsensitive); int AfpPos = Args.indexOf("/add_force", Qt::CaseInsensitive); + int AOPos = Args.indexOf("/add_open", Qt::CaseInsensitive); //Add_Force has the highest priority. if (AfpPos != -1) { DfpPos = -1; BoxPos = -1; - }else + } + else if (AOPos != -1) + { + DfpPos = -1; + BoxPos = -1; + } // the first argument wins - if (BoxPos != -1 && DfpPos != -1) { + else if (BoxPos != -1 && DfpPos != -1) { if (BoxPos < DfpPos) DfpPos = -1; else BoxPos = -1; } @@ -169,9 +175,16 @@ int main(int argc, char *argv[]) LPWSTR cmdLine0 = wcsstr(GetCommandLineW(), L"/add_force"); if (!cmdLine0) return -1; LPWSTR cmdLine = cmdLine0 + 10; - g_PendingMessage = "Add:" + QString::fromWCharArray(cmdLine + 1); + g_PendingMessage = "AddForce:" + QString::fromWCharArray(cmdLine + 1); } + + if (AOPos != -1) { + LPWSTR cmdLine0 = wcsstr(GetCommandLineW(), L"/add_open"); + if (!cmdLine0) return -1; + LPWSTR cmdLine = cmdLine0 + 10; + g_PendingMessage = "AddOpen:" + QString::fromWCharArray(cmdLine + 1); + } if (IsBoxed) { QMessageBox::critical(NULL, "Sandboxie-Plus", CSandMan::tr("Sandboxie Manager can not be run sandboxed!")); From 36a98ad3d08d98261bf4155da1072fc2bd792c9c Mon Sep 17 00:00:00 2001 From: isaak654 Date: Wed, 17 Jul 2024 16:53:18 +0200 Subject: [PATCH 2/3] Merge branch 'master' into master --- SandboxiePlus/SandMan/SandMan.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/SandboxiePlus/SandMan/SandMan.cpp b/SandboxiePlus/SandMan/SandMan.cpp index 5cce4fa3..ca73e784 100644 --- a/SandboxiePlus/SandMan/SandMan.cpp +++ b/SandboxiePlus/SandMan/SandMan.cpp @@ -1640,15 +1640,15 @@ void CSandMan::OnMessage(const QString& MsgData) { - QString respone = QInputDialog::getText(g_GUIParent, tr("Which box you want to add in?"), tr("Type the box name which you are going to set:")); - if(!respone.isEmpty()) + QString response = QInputDialog::getText(g_GUIParent, tr("Which box you want to add in?"), tr("Type the box name which you are going to set:")); + if(!response.isEmpty()) { - if (theAPI->GetBoxByName(respone) != NULL) { + if (theAPI->GetBoxByName(response) != NULL) { if (Message.right(1)=="\\"||!Message.contains(".", Qt::CaseInsensitive)) { - theAPI->GetBoxByName(respone)->AppendText("ForceFolder", Message.mid(4).replace("\"","")); + theAPI->GetBoxByName(response)->AppendText("ForceFolder", Message.mid(4).replace("\"","")); } else { - theAPI->GetBoxByName(respone)->AppendText("ForceProcess", Message.mid(4).replace("\"", "").mid(Message.mid(4).replace("\"", "").lastIndexOf("\\")+1)); + theAPI->GetBoxByName(response)->AppendText("ForceProcess", Message.mid(4).replace("\"", "").mid(Message.mid(4).replace("\"", "").lastIndexOf("\\")+1)); } } @@ -1664,11 +1664,11 @@ void CSandMan::OnMessage(const QString& MsgData) { - QString respone = QInputDialog::getText(g_GUIParent, tr("Which box you want to add in?"), tr("Type the box name which you are going to set:")); - if (!respone.isEmpty()) + QString response = QInputDialog::getText(g_GUIParent, tr("Which box you want to add in?"), tr("Type the box name which you are going to set:")); + if (!response.isEmpty()) { - if (theAPI->GetBoxByName(respone) != NULL) { - theAPI->GetBoxByName(respone)->AppendText("OpenFilePath", Message.mid(4).replace("\"", "")); + if (theAPI->GetBoxByName(response) != NULL) { + theAPI->GetBoxByName(response)->AppendText("OpenFilePath", Message.mid(4).replace("\"", "")); } else { QMessageBox::warning(g_GUIParent, tr("Sandboxie-Plus Warning"), tr("You typed a wrong box name!Nothing was changed."), QMessageBox::Ok, 0); From cf4de21fda72a28dce9360a6fa563985a8e57049 Mon Sep 17 00:00:00 2001 From: love-code-yeyixiao <188240888@qq.com> Date: Thu, 18 Jul 2024 21:16:53 +0800 Subject: [PATCH 3/3] UI --- SandboxiePlus/SandMan/Forms/SettingsWindow.ui | 31 ++++++++++++------- .../SandMan/Windows/SettingsWindow.cpp | 12 +++++++ 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/SandboxiePlus/SandMan/Forms/SettingsWindow.ui b/SandboxiePlus/SandMan/Forms/SettingsWindow.ui index a30acc1e..0d4a8de9 100644 --- a/SandboxiePlus/SandMan/Forms/SettingsWindow.ui +++ b/SandboxiePlus/SandMan/Forms/SettingsWindow.ui @@ -48,7 +48,7 @@ QTabWidget::North - 5 + 1 @@ -477,7 +477,7 @@ - + Start UI when a sandboxed process is started @@ -544,14 +544,14 @@ - + Always use DefaultBox - + Add 'Run Un-Sandboxed' to the context menu @@ -565,7 +565,14 @@ - + + + + Add 'Open Path to Certain Sandbox' to context menu + + + + @@ -579,14 +586,14 @@ - + Scan shell folders and offer links in run menu - + Integrate with Host Start Menu @@ -599,10 +606,10 @@ - + - + Integrate with Host Desktop @@ -615,10 +622,10 @@ - + - + Qt::Vertical @@ -631,7 +638,7 @@ - + Qt::Horizontal diff --git a/SandboxiePlus/SandMan/Windows/SettingsWindow.cpp b/SandboxiePlus/SandMan/Windows/SettingsWindow.cpp index c2f98f8e..4d09119f 100644 --- a/SandboxiePlus/SandMan/Windows/SettingsWindow.cpp +++ b/SandboxiePlus/SandMan/Windows/SettingsWindow.cpp @@ -332,6 +332,8 @@ CSettingsWindow::CSettingsWindow(QWidget* parent) connect(ui.chkAlwaysDefault, SIGNAL(stateChanged(int)), this, SLOT(OnOptChanged())); connect(ui.chkShellMenu2, SIGNAL(stateChanged(int)), this, SLOT(OnOptChanged())); connect(ui.chkShellMenu3, SIGNAL(stateChanged(int)), this, SLOT(OnOptChanged())); + connect(ui.chkShellMenu4, SIGNAL(stateChanged(int)), this, SLOT(OnOptChanged())); + connect(ui.chkScanMenu, SIGNAL(stateChanged(int)), this, SLOT(OnOptChanged())); connect(ui.cmbIntegrateMenu, SIGNAL(currentIndexChanged(int)), this, SLOT(OnOptChanged())); @@ -893,6 +895,7 @@ void CSettingsWindow::LoadSettings() ui.chkShellMenu->setCheckState(IsContextMenu()); ui.chkShellMenu2->setChecked(CSbieUtils::HasContextMenu2()); ui.chkShellMenu3->setChecked(CSbieUtils::HasContextMenu3()); + ui.chkShellMenu4->setChecked(CSbieUtils::HasContextMenu4()); ui.chkAlwaysDefault->setChecked(theConf->GetBool("Options/RunInDefaultBox", false)); ui.cmbDPI->setCurrentIndex(theConf->GetInt("Options/DPIScaling", 1)); @@ -1609,6 +1612,15 @@ void CSettingsWindow::SaveSettings() else CSbieUtils::RemoveContextMenu3(); } + if (ui.chkShellMenu4->isChecked() != CSbieUtils::HasContextMenu4()) { + if (ui.chkShellMenu4->isChecked()) { + CSbieUtils::AddContextMenu4(QApplication::applicationDirPath().replace("/", "\\") + "\\SandMan.exe", + tr("&Open Path to Certain Sandbox"), + QApplication::applicationDirPath().replace("/", "\\") + "\\Start.exe"); + } + else + CSbieUtils::RemoveContextMenu4(); + } theConf->SetValue("Options/RunInDefaultBox", ui.chkAlwaysDefault->isChecked()); theConf->SetValue("Options/CheckSilentMode", ui.chkSilentMode->isChecked());