mirror of
https://github.com/Open-Shell/Open-Shell-Menu.git
synced 2026-04-17 13:23:04 +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());
|
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user