开机启动始终最小化到系统托盘 (#1217)

* feat: 开机启动时始终最小化到系统托盘

* feat: 开机启动选项添加描述
This commit is contained in:
Xu 2025-07-28 19:02:06 +08:00 committed by GitHub
commit 78edfd5217
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
24 changed files with 42 additions and 299 deletions

View file

@ -380,13 +380,12 @@ void AppSettings::IsAlwaysRunAsAdmin(bool value) noexcept {
}
_isAlwaysRunAsAdmin = value;
std::wstring arguments;
if (AutoStartHelper::IsAutoStartEnabled(arguments)) {
// 更新启动任务
AutoStartHelper::EnableAutoStart(value, _isShowNotifyIcon ? arguments.c_str() : nullptr);
}
SaveAsync();
// 更新启动任务
if (AutoStartHelper::IsAutoStartEnabled()) {
AutoStartHelper::EnableAutoStart(value);
}
}
void AppSettings::IsShowNotifyIcon(bool value) noexcept {

View file

@ -1,10 +1,10 @@
#include "pch.h"
#include "AutoStartHelper.h"
#include "CommonSharedConstants.h"
#include "Logger.h"
#include "StrHelper.h"
#include "Win32Helper.h"
#include <Lmcons.h>
#include <propkey.h>
#include <ShlObj.h>
#include <taskschd.h>
@ -49,7 +49,7 @@ static com_ptr<ITaskService> CreateTaskService() noexcept {
return taskService;
}
static bool CreateAutoStartTask(bool runElevated, const wchar_t* arguments) noexcept {
static bool CreateAutoStartTask(bool runElevated) noexcept {
WCHAR usernameDomain[USERNAME_DOMAIN_LEN];
WCHAR username[USERNAME_LEN];
@ -131,7 +131,8 @@ static bool CreateAutoStartTask(bool runElevated, const wchar_t* arguments) noex
Logger::Get().ComError("ITaskSettings::put_StopIfGoingOnBatteries 失败", hr);
return false;
}
hr = taskSettings->put_ExecutionTimeLimit(wil::make_bstr_nothrow(L"PT0S").get()); //Unlimited
// 不限制执行时间
hr = taskSettings->put_ExecutionTimeLimit(wil::make_bstr_nothrow(L"PT0S").get());
if (FAILED(hr)) {
Logger::Get().ComError("ITaskSettings::put_ExecutionTimeLimit 失败", hr);
return false;
@ -216,9 +217,8 @@ static bool CreateAutoStartTask(bool runElevated, const wchar_t* arguments) noex
return false;
}
if (arguments) {
execAction->put_Arguments(wil::make_bstr_nothrow(arguments).get());
}
execAction->put_Arguments(wil::make_bstr_nothrow(
CommonSharedConstants::OPTION_LAUNCH_WITHOUT_WINDOW).get());
}
// ------------------------------------------------------
@ -315,7 +315,7 @@ static bool DeleteAutoStartTask() noexcept {
return true;
}
static bool IsAutoStartTaskActive(std::wstring& arguements) noexcept {
static bool IsAutoStartTaskActive() noexcept {
WCHAR username[USERNAME_LEN];
if (!GetEnvironmentVariable(L"USERNAME", username, USERNAME_LEN)) {
Logger::Get().Win32Error("获取用户名失败");
@ -346,37 +346,6 @@ static bool IsAutoStartTaskActive(std::wstring& arguements) noexcept {
return false;
}
com_ptr<ITaskDefinition> task;
hr = existingRegisteredTask->get_Definition(task.put());
if (FAILED(hr)) {
Logger::Get().ComError("获取 ITaskDefinition 失败", hr);
return false;
}
com_ptr<IActionCollection> actionCollection;
task->get_Actions(actionCollection.put());
if (FAILED(hr)) {
Logger::Get().ComError("获取 IActionCollection 失败", hr);
return false;
}
com_ptr<IAction> action;
// 索引从 1 开始
hr = actionCollection->get_Item(1, action.put());
if (FAILED(hr)) {
Logger::Get().ComError("获取 IAction 失败", hr);
return false;
}
com_ptr<IExecAction> execAction = action.try_as<IExecAction>();
wil::unique_bstr args;
hr = execAction->get_Arguments(args.put());
if (FAILED(hr)) {
Logger::Get().ComError("获取参数失败", hr);
return false;
}
arguements = args ? args.get() : L"";
return isEnabled == VARIANT_TRUE;
}
@ -392,7 +361,7 @@ static std::wstring GetShortcutPath() noexcept {
return StrHelper::Concat(startupDir.get(), L"\\Magpie.lnk");
}
static bool CreateAutoStartShortcut(const wchar_t* arguments) noexcept {
static bool CreateAutoStartShortcut() noexcept {
com_ptr<IShellLink> shellLink = try_create_instance<IShellLink>(CLSID_ShellLink);
if (!shellLink) {
Logger::Get().Error("创建 ShellLink 失败");
@ -400,10 +369,7 @@ static bool CreateAutoStartShortcut(const wchar_t* arguments) noexcept {
}
shellLink->SetPath(Win32Helper::GetExePath().c_str());
if (arguments) {
shellLink->SetArguments(arguments);
}
shellLink->SetArguments(CommonSharedConstants::OPTION_LAUNCH_WITHOUT_WINDOW);
com_ptr<IPersistFile> persistFile = shellLink.try_as<IPersistFile>();
if (!persistFile) {
@ -434,71 +400,18 @@ static bool DeleteAutoStartShortcut() noexcept {
return true;
}
static bool IsAutoStartShortcutExist(std::wstring& arguments) noexcept {
static bool IsAutoStartShortcutExist() noexcept {
std::wstring shortcutPath = GetShortcutPath();
if (shortcutPath.empty()) {
return false;
}
if (!Win32Helper::FileExists(shortcutPath.c_str())) {
return false;
}
com_ptr<IShellLink> shellLink = try_create_instance<IShellLink>(CLSID_ShellLink);
if (!shellLink) {
Logger::Get().Error("创建 ShellLink 失败");
return false;
}
com_ptr<IPersistFile> persistFile = shellLink.try_as<IPersistFile>();
if (!persistFile) {
Logger::Get().Error("获取 IPersistFile 失败");
return false;
}
HRESULT hr = persistFile->Load(shortcutPath.c_str(), STGM_READ);
if (FAILED(hr)) {
Logger::Get().ComError("读取快捷方式失败", hr);
return false;
}
hr = shellLink->Resolve(NULL, SLR_NO_UI);
if (FAILED(hr)) {
Logger::Get().ComError("解析快捷方式失败", hr);
return false;
}
// https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-ishelllinka-getarguments
// 推荐从 IPropertyStore 检索参数
com_ptr<IPropertyStore> propertyStore = shellLink.try_as<IPropertyStore>();
if (!propertyStore) {
Logger::Get().Error("获取 IPropertyStore 失败");
return false;
}
wil::unique_prop_variant prop;
hr = propertyStore->GetValue(PKEY_Link_Arguments, &prop);
if (FAILED(hr)) {
Logger::Get().ComError("检索 Arguments 参数失败", hr);
return false;
}
if (prop.vt == VT_LPWSTR) {
arguments = prop.pwszVal;
} else if (prop.vt == VT_BSTR) {
arguments = prop.bstrVal;
}
return true;
return !shortcutPath.empty() && Win32Helper::FileExists(shortcutPath.c_str());
}
bool AutoStartHelper::EnableAutoStart(bool runElevated, const wchar_t* arguments) noexcept {
if (CreateAutoStartTask(runElevated, arguments)) {
bool AutoStartHelper::EnableAutoStart(bool runElevated) noexcept {
if (CreateAutoStartTask(runElevated)) {
DeleteAutoStartShortcut();
return true;
}
return CreateAutoStartShortcut(arguments);
return CreateAutoStartShortcut();
}
bool AutoStartHelper::DisableAutoStart() noexcept {
@ -508,8 +421,8 @@ bool AutoStartHelper::DisableAutoStart() noexcept {
return result1 || result2;
}
bool AutoStartHelper::IsAutoStartEnabled(std::wstring& arguments) noexcept {
return IsAutoStartTaskActive(arguments) || IsAutoStartShortcutExist(arguments);
bool AutoStartHelper::IsAutoStartEnabled() noexcept {
return IsAutoStartTaskActive() || IsAutoStartShortcutExist();
}
}

View file

@ -3,9 +3,9 @@
namespace Magpie {
struct AutoStartHelper {
static bool EnableAutoStart(bool runElevated, const wchar_t* arguments) noexcept;
static bool EnableAutoStart(bool runElevated) noexcept;
static bool DisableAutoStart() noexcept;
static bool IsAutoStartEnabled(std::wstring& arguments) noexcept;
static bool IsAutoStartEnabled() noexcept;
};
}

View file

@ -291,12 +291,6 @@
<data name="Profile_Performance_GraphicsCard.Header" xml:space="preserve">
<value>Grafikkarte</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Description" xml:space="preserve">
<value>Um diese Einstellung zu verwenden, müssen Sie die Option "Anwendung in der Taskleiste anzeigen" aktivieren</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Header" xml:space="preserve">
<value>Beim Starten in die Taskleiste minimieren</value>
</data>
<data name="AppSettings_Dialog_Error" xml:space="preserve">
<value>Fehler</value>
</data>

View file

@ -606,12 +606,6 @@
<data name="Home_Advanced_SimulateExclusiveFullscreen.Header" xml:space="preserve">
<value>Simulate exclusive fullscreen when scaling</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Description" xml:space="preserve">
<value>You need to turn on "Display the app on the system tray" to use this setting</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Header" xml:space="preserve">
<value>Minimize to system tray at startup</value>
</data>
<data name="AppSettings_Dialog_Error" xml:space="preserve">
<value>Error</value>
</data>
@ -1012,4 +1006,7 @@
<data name="Profile_General_DesktopDuplicationWarning.Title" xml:space="preserve">
<value>This capture method is incompatible with windowed scaling.</value>
</data>
<data name="Settings_Launch_RunAtStartup.Description" xml:space="preserve">
<value>The main window will not appear if "Display the app on the system tray" is enabled</value>
</data>
</root>

View file

@ -645,9 +645,6 @@
<data name="Profile_Cursor_DrawCursor_ScaleFactor_NoScaling.Content" xml:space="preserve">
<value>Sin escalado</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Description" xml:space="preserve">
<value>Debe activar "Mostrar la aplicación en la bandeja del sistema" para usar esta configuración</value>
</data>
<data name="Profile_SourceWindow_CustomCropping_Right.Header" xml:space="preserve">
<value>Derecha</value>
</data>
@ -657,9 +654,6 @@
<data name="Home_Advanced_SimulateExclusiveFullscreen.Description" xml:space="preserve">
<value>Se bloquearán las notificaciones y ventanas emergentes de ciertas aplicaciones</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Header" xml:space="preserve">
<value>Minimizar a la bandeja del sistema al inicio</value>
</data>
<data name="Home_Advanced_DeveloperOptions.Description" xml:space="preserve">
<value>Esta configuración es solo para uso de desarrollo</value>
</data>

View file

@ -343,9 +343,6 @@
<data name="Home_Advanced_DeveloperOptions.Description" xml:space="preserve">
<value>Ces paramètres sont destinés à être utilisés pour le développement uniquement</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Description" xml:space="preserve">
<value>Vous devez activer l'option "Afficher l'application dans la barre d'état système" pour utiliser ce paramètre</value>
</data>
<data name="About_OtherLinks_Repository.Text" xml:space="preserve">
<value>Dépôt Github</value>
</data>
@ -370,9 +367,6 @@
<data name="Dialog_ExeFile" xml:space="preserve">
<value>Fichier exécutable</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Header" xml:space="preserve">
<value>Minimiser dans la barre d'état au démarrage</value>
</data>
<data name="Home_UpdateCard_RemindMeLater.Content" xml:space="preserve">
<value>Me le rappeler plus tard</value>
</data>

View file

@ -606,15 +606,9 @@
<data name="Home_Advanced_SimulateExclusiveFullscreen.Header" xml:space="preserve">
<value>Mensimulasikan layar penuh eksklusif saat melakukan penskalaan</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Description" xml:space="preserve">
<value>Anda harus mengaktifkan "Tampilkan aplikasi pada system tray" untuk menggunakan pengaturan ini</value>
</data>
<data name="Home_Advanced_DeveloperOptions.Description" xml:space="preserve">
<value>Pengaturan ini hanya untuk penggunaan pengembangan</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Header" xml:space="preserve">
<value>Meminimalkan ke baki sistem di startup</value>
</data>
<data name="AppSettings_Dialog_Exit" xml:space="preserve">
<value>Keluar</value>
</data>

View file

@ -453,12 +453,6 @@
<data name="Home_Advanced_SimulateExclusiveFullscreen.Description" xml:space="preserve">
<value>Le notifiche e i popup di determinate applicazioni verranno bloccati</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Description" xml:space="preserve">
<value>Devi attivare "Visualizza l'app nell'area notifiche" per utilizzare questa impostazione</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Header" xml:space="preserve">
<value>Riduci a icona nella barra delle notifiche all'avvio</value>
</data>
<data name="Home_Advanced_InlineParams.Header" xml:space="preserve">
<value>Mette i parametri dell'effetto in linea</value>
</data>

View file

@ -474,9 +474,6 @@
<data name="Home_Advanced_SimulateExclusiveFullscreen.Description" xml:space="preserve">
<value>特定アプリからの通知とポップアップをブロックできます</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Header" xml:space="preserve">
<value>起動時、システムトレイに最小化</value>
</data>
<data name="AppSettings_Dialog_Error" xml:space="preserve">
<value>エラー</value>
</data>
@ -523,9 +520,6 @@
<data name="Profile_Cursor_DrawCursor_ScaleFactor.Header" xml:space="preserve">
<value>スケーリング倍率</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Description" xml:space="preserve">
<value>この項目を使用するには、「システムトレイにアプリを表示する」をオンにする必要があります</value>
</data>
<data name="Profile_Cursor_DrawCursor_ScaleFactor_SameAsSourceWindow.Content" xml:space="preserve">
<value>ソースウィンドウと同じ</value>
</data>

View file

@ -417,9 +417,6 @@
<data name="Home_Advanced_SimulateExclusiveFullscreen.Header" xml:space="preserve">
<value>스케일링 할 때 단독 전체 화면 시뮬레이션</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Description" xml:space="preserve">
<value>이 설정을 사용하려면 "시스템 트레이에 앱 표시"를 켜야 합니다</value>
</data>
<data name="Profile_Cursor_DrawCursor_ScaleFactor_SameAsSourceWindow.Content" xml:space="preserve">
<value>소스 창과 동일</value>
</data>
@ -652,9 +649,6 @@
<data name="Home_Advanced_DeveloperOptions.Description" xml:space="preserve">
<value>이 설정은 개발 전용입니다</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Header" xml:space="preserve">
<value>부팅 시 시스템 트레이로 최소화</value>
</data>
<data name="AppSettings_Dialog_Error" xml:space="preserve">
<value>오류</value>
</data>

View file

@ -247,12 +247,6 @@
<data name="Home_Advanced_SimulateExclusiveFullscreen.Header" xml:space="preserve">
<value>Symuluj wyłączny pełny ekran podczas skalowania</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Description" xml:space="preserve">
<value>Aby korzystać z tego ustawienia, należy włączyć opcję "Wyświetlaj aplikację w zasobniku systemowym"</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Header" xml:space="preserve">
<value>Minimalizuj do zasobnika systemowego przy starcie</value>
</data>
<data name="AppSettings_Dialog_Error" xml:space="preserve">
<value>Błąd</value>
</data>

View file

@ -543,15 +543,9 @@
<data name="Home_Advanced_SimulateExclusiveFullscreen.Description" xml:space="preserve">
<value>Notificações e pop-ups de determinados aplicativos serão bloqueados</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Header" xml:space="preserve">
<value>Minimizar para a área de notificação na inicialização</value>
</data>
<data name="Home_Advanced_SimulateExclusiveFullscreen.Header" xml:space="preserve">
<value>Simular tela cheia exclusiva durante o redimensionamento</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Description" xml:space="preserve">
<value>Você precisa ativar a opção "Exibir o aplicativo na área de notificação" para usar essa configuração</value>
</data>
<data name="AppSettings_Dialog_Error" xml:space="preserve">
<value>Erro</value>
</data>

View file

@ -615,12 +615,6 @@
<data name="Home_Advanced_SimulateExclusiveFullscreen.Header" xml:space="preserve">
<value>Симуляция эксклюзивного полного экрана при масштабировании</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Description" xml:space="preserve">
<value>Для использования этой настройки, включите "Отображать приложение в панели задач"</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Header" xml:space="preserve">
<value>Сворачивать на панель задач при запуске</value>
</data>
<data name="AppSettings_Dialog_Error" xml:space="preserve">
<value>Ошибка</value>
</data>

View file

@ -657,12 +657,6 @@
<data name="Home_Advanced_SimulateExclusiveFullscreen.Header" xml:space="preserve">
<value>அளவிடும்போது பிரத்யேக முழுத்திரனை உருவகப்படுத்துங்கள்</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Description" xml:space="preserve">
<value>இந்த அமைப்பைப் பயன்படுத்த நீங்கள் "கணினி தட்டில் பயன்பாட்டைக் காண்பி" இயக்க வேண்டும்</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Header" xml:space="preserve">
<value>தொடக்கத்தில் கணினி தட்டில் குறைக்கவும்</value>
</data>
<data name="AppSettings_Dialog_Error" xml:space="preserve">
<value>பிழை</value>
</data>

View file

@ -570,12 +570,6 @@
<data name="Home_Advanced_SimulateExclusiveFullscreen.Header" xml:space="preserve">
<value>Ölçekleme sırasında orjinal tam ekranı taklit edin</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Description" xml:space="preserve">
<value>Bu ayarı kullanmak için "Uygulamayı sistem tepsisinde görüntüle" özelliğini açmanız gerekir</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Header" xml:space="preserve">
<value>Başlangıçta sistem tepsisine küçült</value>
</data>
<data name="AppSettings_Dialog_Error" xml:space="preserve">
<value>Hata</value>
</data>

View file

@ -480,12 +480,6 @@
<data name="Home_Advanced_SimulateExclusiveFullscreen.Description" xml:space="preserve">
<value>Сповіщення та спливаючі вікна певних застосунків будуть заблоковані</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Description" xml:space="preserve">
<value>Для використання цього параметра потрібно ввімкнути "Відображати застосунок в системному треї"</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Header" xml:space="preserve">
<value>Згортання в системний трей під час запуску</value>
</data>
<data name="AppSettings_Dialog_Error" xml:space="preserve">
<value>Помилка</value>
</data>

View file

@ -691,12 +691,6 @@
<data name="Settings_Launch_RunAtStartup.Header" xml:space="preserve">
<value>Chạy khi khởi động</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Description" xml:space="preserve">
<value>Bạn cần bật "Hiển thị trên thanh tác vụ" để sử dụng cài đặt này</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Header" xml:space="preserve">
<value>Thu nhỏ về thanh tác vụ khi khởi động</value>
</data>
<data name="ShortcutDialog_Cancel" xml:space="preserve">
<value>Hủy</value>
</data>

View file

@ -606,12 +606,6 @@
<data name="Home_Advanced_SimulateExclusiveFullscreen.Header" xml:space="preserve">
<value>缩放时模拟独占全屏</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Description" xml:space="preserve">
<value>启用了“在系统托盘上显示应用程序”时才能使用此选项</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Header" xml:space="preserve">
<value>启动时最小化到系统托盘</value>
</data>
<data name="AppSettings_Dialog_Error" xml:space="preserve">
<value>错误</value>
</data>
@ -1012,4 +1006,7 @@
<data name="Profile_General_DesktopDuplicationWarning.Title" xml:space="preserve">
<value>此捕获方式和窗口模式缩放不兼容。</value>
</data>
<data name="Settings_Launch_RunAtStartup.Description" xml:space="preserve">
<value>启用了“在系统托盘上显示应用程序”时将不会显示主窗口</value>
</data>
</root>

View file

@ -525,12 +525,6 @@
<data name="Home_Advanced_InlineParams.Header" xml:space="preserve">
<value>內聯效果參數</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Description" xml:space="preserve">
<value>啟用了“工具列圖示”時才能使用此選項</value>
</data>
<data name="Settings_Launch_RunAtStartup_MinimizeAtStartup.Header" xml:space="preserve">
<value>啟動時最小化到工具列圖示</value>
</data>
<data name="Home_Advanced_SimulateExclusiveFullscreen.Header" xml:space="preserve">
<value>縮放時模擬獨占全螢幕</value>
</data>

View file

@ -63,23 +63,13 @@
</local:SettingsCard>
</local:SettingsGroup>
<local:SettingsGroup x:Uid="Settings_Launch">
<local:SettingsExpander x:Uid="Settings_Launch_RunAtStartup"
IsExpanded="{x:Bind ViewModel.IsRunAtStartup, Mode=OneWay}">
<local:SettingsExpander.HeaderIcon>
<local:SettingsCard x:Uid="Settings_Launch_RunAtStartup">
<local:SettingsCard.HeaderIcon>
<FontIcon Glyph="&#xE7B5;" />
</local:SettingsExpander.HeaderIcon>
<local:SettingsExpander.Content>
<ToggleSwitch x:Uid="ToggleSwitch"
IsOn="{x:Bind ViewModel.IsRunAtStartup, Mode=TwoWay}" />
</local:SettingsExpander.Content>
<local:SettingsExpander.Items>
<local:SettingsCard x:Uid="Settings_Launch_RunAtStartup_MinimizeAtStartup"
IsEnabled="{x:Bind ViewModel.IsMinimizeAtStartupEnabled, Mode=OneWay}">
<ToggleSwitch x:Uid="ToggleSwitch"
IsOn="{x:Bind ViewModel.IsMinimizeAtStartup, Mode=TwoWay}" />
</local:SettingsCard>
</local:SettingsExpander.Items>
</local:SettingsExpander>
</local:SettingsCard.HeaderIcon>
<ToggleSwitch x:Uid="ToggleSwitch"
IsOn="{x:Bind ViewModel.IsRunAtStartup, Mode=TwoWay}" />
</local:SettingsCard>
<local:SettingsCard x:Uid="Settings_Launch_AlwaysRunAsAdmin"
IsEnabled="{x:Bind ViewModel.IsProcessElevated, Mode=OneTime}">
<local:SettingsCard.HeaderIcon>

View file

@ -14,10 +14,6 @@ using namespace Magpie;
namespace winrt::Magpie::implementation {
SettingsViewModel::SettingsViewModel() {
_UpdateStartupOptions();
}
IVector<IInspectable> SettingsViewModel::Languages() const {
std::span<const wchar_t*> tags = LocalizationService::Get().SupportedLanguages();
@ -92,36 +88,18 @@ void SettingsViewModel::Theme(int value) {
RaisePropertyChanged(L"Theme");
}
bool SettingsViewModel::IsRunAtStartup() const noexcept {
return AutoStartHelper::IsAutoStartEnabled();
}
void SettingsViewModel::IsRunAtStartup(bool value) {
if (value) {
AutoStartHelper::EnableAutoStart(
AppSettings::Get().IsAlwaysRunAsAdmin(),
_isMinimizeAtStartup ? CommonSharedConstants::OPTION_LAUNCH_WITHOUT_WINDOW : nullptr
);
AutoStartHelper::EnableAutoStart(AppSettings::Get().IsAlwaysRunAsAdmin());
} else {
AutoStartHelper::DisableAutoStart();
}
_UpdateStartupOptions();
RaisePropertyChanged(L"IsMinimizeAtStartupEnabled");
}
void SettingsViewModel::IsMinimizeAtStartup(bool value) {
if (!_isRunAtStartup) {
return;
}
AutoStartHelper::EnableAutoStart(
AppSettings::Get().IsAlwaysRunAsAdmin(),
value ? CommonSharedConstants::OPTION_LAUNCH_WITHOUT_WINDOW : nullptr
);
_UpdateStartupOptions();
}
bool SettingsViewModel::IsMinimizeAtStartupEnabled() const noexcept {
return IsRunAtStartup() && IsShowNotifyIcon();
RaisePropertyChanged(L"IsRunAtStartup");
}
bool SettingsViewModel::IsPortableMode() const noexcept {
@ -153,13 +131,6 @@ bool SettingsViewModel::IsShowNotifyIcon() const noexcept {
void SettingsViewModel::IsShowNotifyIcon(bool value) {
AppSettings::Get().IsShowNotifyIcon(value);
RaisePropertyChanged(L"IsShowNotifyIcon");
if (_isRunAtStartup) {
AutoStartHelper::EnableAutoStart(AppSettings::Get().IsAlwaysRunAsAdmin(), nullptr);
_UpdateStartupOptions();
}
RaisePropertyChanged(L"IsMinimizeAtStartupEnabled");
}
bool SettingsViewModel::IsProcessElevated() const noexcept {
@ -174,17 +145,4 @@ void SettingsViewModel::IsAlwaysRunAsAdmin(bool value) {
AppSettings::Get().IsAlwaysRunAsAdmin(value);
}
void SettingsViewModel::_UpdateStartupOptions() {
std::wstring arguments;
_isRunAtStartup = AutoStartHelper::IsAutoStartEnabled(arguments);
if (_isRunAtStartup) {
_isMinimizeAtStartup = arguments == CommonSharedConstants::OPTION_LAUNCH_WITHOUT_WINDOW;
} else {
_isMinimizeAtStartup = false;
}
RaisePropertyChanged(L"IsRunAtStartup");
RaisePropertyChanged(L"IsMinimizeAtStartup");
}
}

View file

@ -5,8 +5,6 @@ namespace winrt::Magpie::implementation {
struct SettingsViewModel : SettingsViewModelT<SettingsViewModel>,
wil::notify_property_changed_base<SettingsViewModel> {
SettingsViewModel();
IVector<IInspectable> Languages() const;
int Language() const noexcept;
@ -18,20 +16,9 @@ struct SettingsViewModel : SettingsViewModelT<SettingsViewModel>,
int Theme() const noexcept;
void Theme(int value);
bool IsRunAtStartup() const noexcept {
return _isRunAtStartup;
}
bool IsRunAtStartup() const noexcept;
void IsRunAtStartup(bool value);
bool IsMinimizeAtStartup() const noexcept {
return _isMinimizeAtStartup;
}
void IsMinimizeAtStartup(bool value);
bool IsMinimizeAtStartupEnabled() const noexcept;
bool IsPortableMode() const noexcept;
void IsPortableMode(bool value);
@ -44,12 +31,6 @@ struct SettingsViewModel : SettingsViewModelT<SettingsViewModel>,
bool IsAlwaysRunAsAdmin() const noexcept;
void IsAlwaysRunAsAdmin(bool value);
private:
void _UpdateStartupOptions();
bool _isRunAtStartup = false;
bool _isMinimizeAtStartup = false;
};
}

View file

@ -7,8 +7,6 @@ namespace Magpie {
Int32 Theme;
Boolean IsRunAtStartup;
Boolean IsMinimizeAtStartup;
Boolean IsMinimizeAtStartupEnabled { get; };
Boolean IsPortableMode;
void OpenConfigLocation();
Boolean IsShowNotifyIcon;