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:
ge0rdi
2020-08-31 19:20:09 +02:00
parent 7ee668e474
commit 6581868336
4 changed files with 54 additions and 15 deletions

View File

@@ -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()); retval.reserve(m_settings.size());
for (const auto& i : m_settings) for (const auto& i : m_settings)
retval.emplace_back(i.second); retval.emplace_back(i.first);
return retval; return retval;
} }

View File

@@ -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; Setting get(const std::wstring_view& name) const;
private: private:

View File

@@ -70,6 +70,11 @@ static bool ActivateModernSettingPage(const WCHAR* page)
extern ModernSettings::Setting GetModernSetting(LPCITEMIDLIST pidl); 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) static HRESULT OpenItemByPidl(LPCITEMIDLIST pidl)
{ {
auto child = ILFindLastID(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.hostId == L"{6E6DDBCB-9C89-434B-A994-D5F22239523B}")
{ {
if (setting.deepLink.empty())
return E_INVALIDARG;
std::wstring cmd(L"windowsdefender://"); std::wstring cmd(L"windowsdefender://");
cmd += setting.deepLink; 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()) if (setting.pageId.empty())

View File

@@ -91,16 +91,11 @@ public:
ULONG i = 0; ULONG i = 0;
while (SUCCEEDED(hr) && i < celt && m_item < m_items.size()) while (SUCCEEDED(hr) && i < celt && m_item < m_items.size())
{ {
const auto& s = m_items[m_item]; hr = m_parent->CreateChildID(m_items[m_item], &rgelt[i]);
if ((s.hostId.empty() && s.deepLink.empty()) || if (SUCCEEDED(hr))
(s.hostId == L"{6E6DDBCB-9C89-434B-A994-D5F22239523B}" && !s.deepLink.empty()))
{ {
hr = m_parent->CreateChildID(s.fileName, &rgelt[i]); celtFetched++;
if (SUCCEEDED(hr)) i++;
{
celtFetched++;
i++;
}
} }
m_item++; m_item++;
@@ -141,7 +136,7 @@ public:
private: private:
CComPtr<CModernSettingsShellFolder> m_parent; CComPtr<CModernSettingsShellFolder> m_parent;
std::shared_ptr<ModernSettings> m_settings; std::shared_ptr<ModernSettings> m_settings;
std::vector<ModernSettings::Setting> m_items; std::vector<std::wstring_view> m_items;
DWORD m_item = 0; DWORD m_item = 0;
}; };