diff --git a/TrafficMonitor/CommonData.h b/TrafficMonitor/CommonData.h index 47b200d..bfc0d81 100644 --- a/TrafficMonitor/CommonData.h +++ b/TrafficMonitor/CommonData.h @@ -337,6 +337,7 @@ struct GeneralSettingData bool check_update_when_start{ true }; int update_source{}; //更新源。0: GitHub; 1: Gitee bool auto_run{ false }; + bool auto_run_by_task_scheduler{ false }; //是否通过任务计划程序实现开机自启 bool show_notify_icon{ true }; //显示通知区域图标 //通知消息 bool traffic_tip_enable{ false }; //是否启用流量超出时提示 diff --git a/TrafficMonitor/GeneralSettingsDlg.cpp b/TrafficMonitor/GeneralSettingsDlg.cpp index d8fc6c1..aa4cb08 100644 --- a/TrafficMonitor/GeneralSettingsDlg.cpp +++ b/TrafficMonitor/GeneralSettingsDlg.cpp @@ -147,23 +147,31 @@ bool CGeneralSettingsDlg::ShowHardwareMonitorWarning() void CGeneralSettingsDlg::AddOrUpdateAutoRunTooltip(bool add) { - CString str_tool_tip; -#ifdef WITHOUT_TEMPERATURE - str_tool_tip = CCommon::LoadText(IDS_AUTO_RUN_METHOD_REGESTRY); -#else - str_tool_tip = CCommon::LoadText(IDS_AUTO_RUN_METHOD_TASK_SCHEDULE); -#endif - if (!m_auto_run_path.empty()) + if (m_data.auto_run) { - str_tool_tip += _T("\r\n"); - str_tool_tip += CCommon::LoadText(IDS_PATH, _T(": ")); - str_tool_tip += m_auto_run_path.c_str(); + CString str_tool_tip; + if (m_data.auto_run_by_task_scheduler) + str_tool_tip = CCommon::LoadText(IDS_AUTO_RUN_METHOD_TASK_SCHEDULE); + else + str_tool_tip = CCommon::LoadText(IDS_AUTO_RUN_METHOD_REGESTRY); + if (!m_auto_run_path.empty()) + { + str_tool_tip += _T("\r\n"); + str_tool_tip += CCommon::LoadText(IDS_PATH, _T(": ")); + str_tool_tip += m_auto_run_path.c_str(); + } + if (add) + m_toolTip.AddTool(GetDlgItem(IDC_AUTO_RUN_CHECK), str_tool_tip); + else + m_toolTip.UpdateTipText(str_tool_tip, GetDlgItem(IDC_AUTO_RUN_CHECK)); } - if (add) - m_toolTip.AddTool(GetDlgItem(IDC_AUTO_RUN_CHECK), str_tool_tip); else - m_toolTip.UpdateTipText(str_tool_tip, GetDlgItem(IDC_AUTO_RUN_CHECK)); - + { + if (add) + m_toolTip.AddTool(GetDlgItem(IDC_AUTO_RUN_CHECK), CString()); + else + m_toolTip.UpdateTipText(CString(), GetDlgItem(IDC_AUTO_RUN_CHECK)); + } } bool CGeneralSettingsDlg::IsMonitorTimeSpanModified() const @@ -203,6 +211,10 @@ void CGeneralSettingsDlg::SetControlEnable() m_select_cpu_combo.EnableWindow(m_data.IsHardwareEnable(HI_CPU)); EnableDlgCtrl(IDC_SELECT_CONNECTIONS_BUTTON, !m_data.show_all_interface); + + EnableDlgCtrl(IDC_RESET_AUTO_RUN_BUTTON, m_data.auto_run); + EnableDlgCtrl(IDC_AUTO_RUN_METHOD_REGESTRY_RADIO, m_data.auto_run); + EnableDlgCtrl(IDC_AUTO_RUN_METHOD_TASK_SCHEDULE_RADIO, m_data.auto_run); } @@ -234,6 +246,8 @@ BEGIN_MESSAGE_MAP(CGeneralSettingsDlg, CTabDlg) ON_BN_CLICKED(IDC_RESET_AUTO_RUN_BUTTON, &CGeneralSettingsDlg::OnBnClickedResetAutoRunButton) ON_EN_CHANGE(IDC_MONITOR_SPAN_EDIT, &CGeneralSettingsDlg::OnEnChangeMonitorSpanEdit) ON_MESSAGE(WM_SPIN_EDIT_POS_CHANGED, &CGeneralSettingsDlg::OnSpinEditPosChanged) + ON_BN_CLICKED(IDC_AUTO_RUN_METHOD_REGESTRY_RADIO, &CGeneralSettingsDlg::OnBnClickedAutoRunMethodRegestryRadio) + ON_BN_CLICKED(IDC_AUTO_RUN_METHOD_TASK_SCHEDULE_RADIO, &CGeneralSettingsDlg::OnBnClickedAutoRunMethodTaskScheduleRadio) END_MESSAGE_MAP() @@ -262,16 +276,46 @@ BOOL CGeneralSettingsDlg::OnInitDialog() //检查开始菜单的“启动”目录下有没有程序的快捷方式,如果有则设置开机自启动,然后删除快捷方式 wstring start_up_path = CCommon::GetStartUpPath(); bool shortcut_exist = CCommon::FileExist((start_up_path + L"\\TrafficMonitor.lnk").c_str()); + m_data.auto_run = false; +#ifdef WITHOUT_TEMPERATURE + m_data.auto_run_by_task_scheduler = false; +#else + m_data.auto_run_by_task_scheduler = true; +#endif + if (shortcut_exist) { - theApp.SetAutoRun(true); + theApp.SetAutoRun(true, false); m_data.auto_run = true; DeleteFile((start_up_path + L"\\TrafficMonitor.lnk").c_str()); + CheckDlgButton(IDC_AUTO_RUN_METHOD_REGESTRY_RADIO, TRUE); } + //检查开机自动运行的设置是通过注册表还是任务计划程序实现的,并设置相应的选项 else { - m_data.auto_run = theApp.GetAutoRun(&m_auto_run_path); + bool auto_run_by_registry = theApp.GetAutoRun(&m_auto_run_path, false); + if (auto_run_by_registry) + { + CheckDlgButton(IDC_AUTO_RUN_METHOD_REGESTRY_RADIO, TRUE); + m_data.auto_run = true; + m_data.auto_run_by_task_scheduler = false; + } + else + { + bool auto_run_by_task_scheduler = theApp.GetAutoRun(&m_auto_run_path, true); + if (auto_run_by_task_scheduler) + { + CheckDlgButton(IDC_AUTO_RUN_METHOD_TASK_SCHEDULE_RADIO, TRUE); + m_data.auto_run = true; + m_data.auto_run_by_task_scheduler = true; + } + } } + if (m_data.auto_run_by_task_scheduler) + CheckDlgButton(IDC_AUTO_RUN_METHOD_TASK_SCHEDULE_RADIO, TRUE); + else + CheckDlgButton(IDC_AUTO_RUN_METHOD_REGESTRY_RADIO, TRUE); + ((CButton*)GetDlgItem(IDC_SAVE_TO_APPDATA_RADIO))->SetCheck(!m_data.portable_mode); ((CButton*)GetDlgItem(IDC_SAVE_TO_PROGRAM_DIR_RADIO))->SetCheck(m_data.portable_mode); @@ -413,15 +457,16 @@ void CGeneralSettingsDlg::OnBnClickedCheckNowButton() void CGeneralSettingsDlg::OnBnClickedCheckUpdateCheck() { // TODO: 在此添加控件通知处理程序代码 - m_data.check_update_when_start = (((CButton*)GetDlgItem(IDC_CHECK_UPDATE_CHECK))->GetCheck() != 0); + m_data.check_update_when_start = (IsDlgButtonChecked(IDC_CHECK_UPDATE_CHECK) != 0); } void CGeneralSettingsDlg::OnBnClickedAutoRunCheck() { // TODO: 在此添加控件通知处理程序代码 - m_data.auto_run = (((CButton*)GetDlgItem(IDC_AUTO_RUN_CHECK))->GetCheck() != 0); + m_data.auto_run = (IsDlgButtonChecked(IDC_AUTO_RUN_CHECK) != 0); m_auto_run_modified = true; + SetControlEnable(); } @@ -492,7 +537,7 @@ void CGeneralSettingsDlg::OnOK() void CGeneralSettingsDlg::OnBnClickedTodayTrafficTipCheck() { // TODO: 在此添加控件通知处理程序代码 - m_data.traffic_tip_enable = (((CButton*)GetDlgItem(IDC_TODAY_TRAFFIC_TIP_CHECK))->GetCheck() != 0); + m_data.traffic_tip_enable = (IsDlgButtonChecked(IDC_TODAY_TRAFFIC_TIP_CHECK) != 0); SetControlEnable(); } @@ -500,7 +545,7 @@ void CGeneralSettingsDlg::OnBnClickedTodayTrafficTipCheck() void CGeneralSettingsDlg::OnBnClickedMemoryUsageTipCheck() { // TODO: 在此添加控件通知处理程序代码 - m_data.memory_usage_tip.enable = (((CButton*)GetDlgItem(IDC_MEMORY_USAGE_TIP_CHECK))->GetCheck() != 0); + m_data.memory_usage_tip.enable = (IsDlgButtonChecked(IDC_MEMORY_USAGE_TIP_CHECK) != 0); SetControlEnable(); } @@ -515,7 +560,7 @@ void CGeneralSettingsDlg::OnBnClickedOpenConfigPathButton() void CGeneralSettingsDlg::OnBnClickedShowAllConnectionCheck() { // TODO: 在此添加控件通知处理程序代码 - m_data.show_all_interface = (((CButton*)GetDlgItem(IDC_SHOW_ALL_CONNECTION_CHECK))->GetCheck() != 0); + m_data.show_all_interface = (IsDlgButtonChecked(IDC_SHOW_ALL_CONNECTION_CHECK) != 0); SetControlEnable(); } @@ -751,13 +796,13 @@ void CGeneralSettingsDlg::OnBnClickedResetAutoRunButton() //先删除开机自动运行 theApp.SetAutoRunByRegistry(false); theApp.SetAutoRunByTaskScheduler(false); - if (!theApp.SetAutoRun(true)) //重新设置开机自动运行 + if (!theApp.SetAutoRun(true, m_data.auto_run_by_task_scheduler)) //重新设置开机自动运行 { MessageBox(CCommon::LoadText(IDS_SET_AUTO_RUN_FAILED_WARNING), NULL, MB_ICONWARNING | MB_OK); return; } //获取开机自动运行的路径 - bool auto_run = theApp.GetAutoRun(&m_auto_run_path); + bool auto_run = theApp.GetAutoRun(&m_auto_run_path, m_data.auto_run_by_task_scheduler); //重新勾选“开机自动运行”复选框 CheckDlgButton(IDC_AUTO_RUN_CHECK, auto_run); //更新鼠标提示 @@ -769,3 +814,17 @@ void CGeneralSettingsDlg::OnEnChangeMonitorSpanEdit() { m_data.monitor_time_span = m_monitor_span_edit.GetValue(); } + +void CGeneralSettingsDlg::OnBnClickedAutoRunMethodRegestryRadio() +{ + m_data.auto_run_by_task_scheduler = false; + m_auto_run_modified = true; + SetControlEnable(); +} + +void CGeneralSettingsDlg::OnBnClickedAutoRunMethodTaskScheduleRadio() +{ + m_data.auto_run_by_task_scheduler = true; + m_auto_run_modified = true; + SetControlEnable(); +} diff --git a/TrafficMonitor/GeneralSettingsDlg.h b/TrafficMonitor/GeneralSettingsDlg.h index e5d32fa..acec044 100644 --- a/TrafficMonitor/GeneralSettingsDlg.h +++ b/TrafficMonitor/GeneralSettingsDlg.h @@ -103,4 +103,7 @@ public: afx_msg void OnBnClickedResetAutoRunButton(); afx_msg void OnEnChangeMonitorSpanEdit(); protected: +public: + afx_msg void OnBnClickedAutoRunMethodRegestryRadio(); + afx_msg void OnBnClickedAutoRunMethodTaskScheduleRadio(); }; diff --git a/TrafficMonitor/TrafficMonitor.cpp b/TrafficMonitor/TrafficMonitor.cpp index 4f787e7..df3c8b9 100644 --- a/TrafficMonitor/TrafficMonitor.cpp +++ b/TrafficMonitor/TrafficMonitor.cpp @@ -634,53 +634,60 @@ UINT CTrafficMonitorApp::InitOpenHardwareMonitorLibThreadFunc(LPVOID lpParam) return 0; } -bool CTrafficMonitorApp::SetAutoRun(bool auto_run) +bool CTrafficMonitorApp::SetAutoRun(bool auto_run, bool task_scheduler) { - //不含温度监控的版本使用添加注册表项的方式实现开机自启动 -#ifdef WITHOUT_TEMPERATURE - return SetAutoRunByRegistry(auto_run); -#else - //包含温度监控的版本使用任务计划的方式实现开机自启动 - return SetAutoRunByTaskScheduler(auto_run); -#endif -} - -bool CTrafficMonitorApp::GetAutoRun(wstring* auto_run_path) -{ - if (auto_run_path != nullptr) - auto_run_path->clear(); - //不含温度监控的版本使用添加注册表项的方式实现开机自启动 -#ifdef WITHOUT_TEMPERATURE - CRegKey key; - if (key.Open(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run")) != ERROR_SUCCESS) + if (task_scheduler) { - //打开注册表“Software\\Microsoft\\Windows\\CurrentVersion\\Run”失败,则返回false - return false; - } - wchar_t buff[256]; - ULONG size{ 256 }; - if (key.QueryStringValue(APP_NAME, buff, &size) == ERROR_SUCCESS) //如果找到了“TrafficMonitor”键 - { - if (auto_run_path != nullptr) - { - //保存路径 - *auto_run_path = buff; - //去掉前后的引号 - if (auto_run_path->front() == L'\"') - *auto_run_path = auto_run_path->substr(1); - if (auto_run_path->back() = L'\"') - auto_run_path->pop_back(); - } - return (m_module_path_reg == buff); //如果“TrafficMonitor”的值是当前程序的路径,就返回true,否则返回false + //使用任务计划的方式设置开机自启动 + return SetAutoRunByTaskScheduler(auto_run); } else { - return false; //没有找到“TrafficMonitor”键,返回false + //使用添加注册表项的方式实现开机自启动 + return SetAutoRunByRegistry(auto_run); + } +} + +bool CTrafficMonitorApp::GetAutoRun(wstring* auto_run_path, bool task_scheduler) +{ + if (auto_run_path != nullptr) + auto_run_path->clear(); + + if (task_scheduler) + { + //使用任务计划的方式实现开机自启动 + return is_auto_start_task_active_for_this_user(auto_run_path); + } + else + { + //使用添加注册表项的方式实现开机自启动 + CRegKey key; + if (key.Open(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run")) != ERROR_SUCCESS) + { + //打开注册表“Software\\Microsoft\\Windows\\CurrentVersion\\Run”失败,则返回false + return false; + } + wchar_t buff[256]; + ULONG size{ 256 }; + if (key.QueryStringValue(APP_NAME, buff, &size) == ERROR_SUCCESS) //如果找到了“TrafficMonitor”键 + { + if (auto_run_path != nullptr) + { + //保存路径 + *auto_run_path = buff; + //去掉前后的引号 + if (auto_run_path->front() == L'\"') + *auto_run_path = auto_run_path->substr(1); + if (auto_run_path->back() = L'\"') + auto_run_path->pop_back(); + } + return (m_module_path_reg == buff); //如果“TrafficMonitor”的值是当前程序的路径,就返回true,否则返回false + } + else + { + return false; //没有找到“TrafficMonitor”键,返回false + } } -#else - //包含温度监控的版本使用任务计划的方式实现开机自启动 - return is_auto_start_task_active_for_this_user(auto_run_path); -#endif } bool CTrafficMonitorApp::SetAutoRunByRegistry(bool auto_run) diff --git a/TrafficMonitor/TrafficMonitor.h b/TrafficMonitor/TrafficMonitor.h index 8900935..1e1c0b0 100644 --- a/TrafficMonitor/TrafficMonitor.h +++ b/TrafficMonitor/TrafficMonitor.h @@ -130,8 +130,8 @@ public: static UINT CheckUpdateThreadFunc(LPVOID lpParam); static UINT InitOpenHardwareMonitorLibThreadFunc(LPVOID lpParam); - bool SetAutoRun(bool auto_run); - bool GetAutoRun(wstring* auto_run_path); //判断是否开机自动进行,如果是,将开机自动运行的路径写入auto_run_path + bool SetAutoRun(bool auto_run, bool task_scheduler); + bool GetAutoRun(wstring* auto_run_path, bool task_scheduler); //判断是否开机自动进行,如果是,将开机自动运行的路径写入auto_run_path bool SetAutoRunByRegistry(bool auto_run); //通过注册表实现开机自启动 bool SetAutoRunByTaskScheduler(bool auto_run); //通过任务计划实现开机自启动 diff --git a/TrafficMonitor/TrafficMonitor.rc b/TrafficMonitor/TrafficMonitor.rc index 46806df..d47601c 100644 Binary files a/TrafficMonitor/TrafficMonitor.rc and b/TrafficMonitor/TrafficMonitor.rc differ diff --git a/TrafficMonitor/TrafficMonitorDlg.cpp b/TrafficMonitor/TrafficMonitorDlg.cpp index 3b06765..e7952e9 100644 --- a/TrafficMonitor/TrafficMonitorDlg.cpp +++ b/TrafficMonitor/TrafficMonitorDlg.cpp @@ -786,7 +786,7 @@ void CTrafficMonitorDlg::ApplySettings(COptionsDlg& optionsDlg) if (optionsDlg.m_tab3_dlg.IsAutoRunModified()) { - if (!theApp.SetAutoRun(theApp.m_general_data.auto_run)) + if (!theApp.SetAutoRun(theApp.m_general_data.auto_run, theApp.m_general_data.auto_run_by_task_scheduler)) MessageBox(CCommon::LoadText(IDS_SET_AUTO_RUN_FAILED_WARNING), NULL, MB_ICONWARNING | MB_OK); } diff --git a/TrafficMonitor/language/English.ini b/TrafficMonitor/language/English.ini index 926a750..2d62d80 100644 --- a/TrafficMonitor/language/English.ini +++ b/TrafficMonitor/language/English.ini @@ -208,7 +208,7 @@ IDS_SHOW_NET_SPEED_GRAPH_TIP = "Display net speed indicator on upload, download IDS_REFRESH_CONNECTION_LIST= "Refresh connection list" IDS_HARDWARE_MONITOR_INIT_FAILED = "Hardware monitoring function failed to initialize, hardware monitoring will not be available!" IDS_HARDWARE_INFO_ACQUIRE_FAILED_ERROR = "Error getting hardware monitoring data!" -IDS_AUTO_RUN_METHOD_REGESTRY= "Auto-run mode : Registry" +IDS_AUTO_RUN_METHOD_REGESTRY= "Auto-run mode: Registry" IDS_AUTO_RUN_METHOD_TASK_SCHEDULE= "Auto-run mode: Task schedule" IDS_PATH = "Path" IDS_SET_AUTO_RUN_FAILED_WARNING= "Set auto-run at start up failed!" @@ -263,8 +263,12 @@ TXT_APPLICATION_SETTINGS = "Application Settings" TXT_CHECK_UPDATE = "Check for update at startup" TXT_CHECK_NOW = "&Check now" TXT_UPDATE_SOURCE = "Update source:" +TXT_AUTO_RUN = "Auto run" TXT_AUTO_RUN_CHECK = "Auto run when Windows starts" TXT_RESET_AUTO_RUN_BUTTON = "Reset autorun" +TXT_AUTO_RUN_METHOD = "Auto-run mode:" +TXT_AUTO_RUN_METHOD_REGESTRY= "Registry" +TXT_AUTO_RUN_METHOD_TASK_SCHEDULE= "Task schedule (Administrator permission required)" TXT_LANGUAGE = "Language:" TXT_CONFIGURATION_AND_DATA_FILES = "Configuration and data files" TXT_SAVE_TO_APPDATA_RADIO = "Save to Appdata directory" diff --git a/TrafficMonitor/language/Simplified_Chinese.ini b/TrafficMonitor/language/Simplified_Chinese.ini index 4595f9f..592e8d5 100644 --- a/TrafficMonitor/language/Simplified_Chinese.ini +++ b/TrafficMonitor/language/Simplified_Chinese.ini @@ -263,9 +263,13 @@ TXT_APPLICATION_SETTINGS = "应用程序设置" TXT_CHECK_UPDATE = "启动时检查更新" TXT_CHECK_NOW = "立即检查(&C)" TXT_UPDATE_SOURCE = "更新源:" +TXT_AUTO_RUN = "开机自动运行" TXT_AUTO_RUN_CHECK = "开机时自动运行" TXT_RESET_AUTO_RUN_BUTTON = "重新设置开机自动运行" -TXT_LANGUAGE = "语言:" +TXT_AUTO_RUN_METHOD = "开机自动运行方式:" +TXT_AUTO_RUN_METHOD_REGESTRY= "注册表" +TXT_AUTO_RUN_METHOD_TASK_SCHEDULE= "任务计划(需要管理员权限)" +TXT_LANGUAGE = "语言:" TXT_CONFIGURATION_AND_DATA_FILES = "配置和数据文件" TXT_SAVE_TO_APPDATA_RADIO = "保存到 Appdata 目录" TXT_SAVE_TO_PROGRAM_DIR_RADIO = "保存到程序所在目录" diff --git a/TrafficMonitor/language/Traditional_Chinese.ini b/TrafficMonitor/language/Traditional_Chinese.ini index 5f28c93..14e6291 100644 --- a/TrafficMonitor/language/Traditional_Chinese.ini +++ b/TrafficMonitor/language/Traditional_Chinese.ini @@ -263,9 +263,13 @@ TXT_APPLICATION_SETTINGS = "應用程式設定" TXT_CHECK_UPDATE = "啟動時檢查更新" TXT_CHECK_NOW = "立即檢查(&C)" TXT_UPDATE_SOURCE = "更新來源:" +TXT_AUTO_RUN = "開機自動執行" TXT_AUTO_RUN_CHECK = "開機時自動執行" TXT_RESET_AUTO_RUN_BUTTON = "重新設定開機自動執行" -TXT_LANGUAGE = "語言:" +TXT_AUTO_RUN_METHOD = "開機自動執行方式:" +TXT_AUTO_RUN_METHOD_REGESTRY= "登錄檔" +TXT_AUTO_RUN_METHOD_TASK_SCHEDULE= "工作排程(需要管理員許可權)" +TXT_LANGUAGE = "語言:" TXT_CONFIGURATION_AND_DATA_FILES = "設定檔和資料檔" TXT_SAVE_TO_APPDATA_RADIO = "儲存到 Appdata 目錄" TXT_SAVE_TO_PROGRAM_DIR_RADIO = "儲存到程式所在目錄" diff --git a/TrafficMonitor/resource.h b/TrafficMonitor/resource.h index c551e6b..f6a70b9 100644 --- a/TrafficMonitor/resource.h +++ b/TrafficMonitor/resource.h @@ -344,6 +344,8 @@ #define IDC_GPU_TEMP_TIP_EDIT 1217 #define IDC_HDD_TIP_EDIT 1218 #define IDC_MBD_TEMP_TIP_EDIT 1219 +#define IDC_AUTO_RUN_METHOD_REGESTRY_RADIO 1220 +#define IDC_AUTO_RUN_METHOD_TASK_SCHEDULE_RADIO 1221 #define ID_32771 32771 #define ID_NETWORK_INFO 32772 #define ID_32773 32773 @@ -466,7 +468,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 349 #define _APS_NEXT_COMMAND_VALUE 33666 -#define _APS_NEXT_CONTROL_VALUE 1220 +#define _APS_NEXT_CONTROL_VALUE 1221 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif