mirror of
https://github.com/Open-Shell/Open-Shell-Menu.git
synced 2026-04-11 17:37:22 +10:00
ModernSettings: Add support for more settings
Based on `HostId`:
* {7E0522FC-1AC4-41CA-AFD0-3610417A9C41}
execute `shell:::{PageId}`
* {12B1697E-D3A0-4DBC-B568-CCF64A3F934D}
execute command in `DeepLink`
This commit is contained in:
@@ -359,13 +359,13 @@ ModernSettings::Setting::Setting(const Blob& blob)
|
||||
});
|
||||
}
|
||||
|
||||
std::vector<ModernSettings::Setting> ModernSettings::enumerate() const
|
||||
std::vector<std::wstring_view> ModernSettings::enumerate() const
|
||||
{
|
||||
std::vector<ModernSettings::Setting> retval;
|
||||
std::vector<std::wstring_view> retval;
|
||||
retval.reserve(m_settings.size());
|
||||
|
||||
for (const auto& i : m_settings)
|
||||
retval.emplace_back(i.second);
|
||||
retval.emplace_back(i.first);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -127,7 +127,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
std::vector<Setting> enumerate() const;
|
||||
std::vector<std::wstring_view> enumerate() const;
|
||||
Setting get(const std::wstring_view& name) const;
|
||||
|
||||
private:
|
||||
|
||||
@@ -70,6 +70,11 @@ static bool ActivateModernSettingPage(const WCHAR* page)
|
||||
|
||||
extern ModernSettings::Setting GetModernSetting(LPCITEMIDLIST pidl);
|
||||
|
||||
static HRESULT Execute(const wchar_t* cmd)
|
||||
{
|
||||
return (intptr_t)::ShellExecute(nullptr, L"open", cmd, nullptr, nullptr, SW_SHOWNORMAL) > 32 ? S_OK : E_FAIL;
|
||||
}
|
||||
|
||||
static HRESULT OpenItemByPidl(LPCITEMIDLIST pidl)
|
||||
{
|
||||
auto child = ILFindLastID(pidl);
|
||||
@@ -80,10 +85,49 @@ static HRESULT OpenItemByPidl(LPCITEMIDLIST pidl)
|
||||
|
||||
if (setting.hostId == L"{6E6DDBCB-9C89-434B-A994-D5F22239523B}")
|
||||
{
|
||||
if (setting.deepLink.empty())
|
||||
return E_INVALIDARG;
|
||||
|
||||
std::wstring cmd(L"windowsdefender://");
|
||||
cmd += setting.deepLink;
|
||||
|
||||
return (intptr_t)::ShellExecute(nullptr, L"open", cmd.c_str(), nullptr, nullptr, SW_SHOWNORMAL) > 32 ? S_OK : E_FAIL;
|
||||
return Execute(cmd.c_str());
|
||||
}
|
||||
|
||||
if (setting.hostId == L"{7E0522FC-1AC4-41CA-AFD0-3610417A9C41}")
|
||||
{
|
||||
if (setting.pageId.empty())
|
||||
return E_INVALIDARG;
|
||||
|
||||
std::wstring cmd(L"shell:::");
|
||||
cmd += setting.pageId;
|
||||
|
||||
return Execute(cmd.c_str());
|
||||
}
|
||||
|
||||
if (setting.hostId == L"{12B1697E-D3A0-4DBC-B568-CCF64A3F934D}")
|
||||
{
|
||||
if (setting.deepLink.empty())
|
||||
return E_INVALIDARG;
|
||||
|
||||
std::wstring cmd(setting.deepLink);
|
||||
|
||||
if (cmd.compare(0, 8, L"shell:::") == 0)
|
||||
return Execute(cmd.c_str());
|
||||
|
||||
cmd.resize(MAX_PATH);
|
||||
DoEnvironmentSubst(cmd.data(), (UINT)cmd.size());
|
||||
|
||||
STARTUPINFO startupInfo = { sizeof(startupInfo) };
|
||||
PROCESS_INFORMATION processInfo{};
|
||||
|
||||
if (!CreateProcess(nullptr, cmd.data(), nullptr, nullptr, FALSE, 0, nullptr, nullptr, &startupInfo, &processInfo))
|
||||
return E_FAIL;
|
||||
|
||||
CloseHandle(processInfo.hThread);
|
||||
CloseHandle(processInfo.hProcess);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
if (setting.pageId.empty())
|
||||
|
||||
@@ -91,16 +91,11 @@ public:
|
||||
ULONG i = 0;
|
||||
while (SUCCEEDED(hr) && i < celt && m_item < m_items.size())
|
||||
{
|
||||
const auto& s = m_items[m_item];
|
||||
if ((s.hostId.empty() && s.deepLink.empty()) ||
|
||||
(s.hostId == L"{6E6DDBCB-9C89-434B-A994-D5F22239523B}" && !s.deepLink.empty()))
|
||||
hr = m_parent->CreateChildID(m_items[m_item], &rgelt[i]);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = m_parent->CreateChildID(s.fileName, &rgelt[i]);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
celtFetched++;
|
||||
i++;
|
||||
}
|
||||
celtFetched++;
|
||||
i++;
|
||||
}
|
||||
|
||||
m_item++;
|
||||
@@ -141,7 +136,7 @@ public:
|
||||
private:
|
||||
CComPtr<CModernSettingsShellFolder> m_parent;
|
||||
std::shared_ptr<ModernSettings> m_settings;
|
||||
std::vector<ModernSettings::Setting> m_items;
|
||||
std::vector<std::wstring_view> m_items;
|
||||
DWORD m_item = 0;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user