diff --git a/server/2015Remote/SystemDlg.cpp b/server/2015Remote/SystemDlg.cpp index 6296d2c..3075172 100644 --- a/server/2015Remote/SystemDlg.cpp +++ b/server/2015Remote/SystemDlg.cpp @@ -80,6 +80,7 @@ BOOL CSystemDlg::OnInitDialog() SetWindowText(str);//设置对话框标题 m_ControlList.SetExtendedStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT); + LoadSortPreference(); // 加载上次记忆的排序偏好 if (m_bHow==TOKEN_PSLIST) { //进程管理初始化列表 m_ControlList.InsertColumnL(0, "映像名称", LVCFMT_LEFT, 180); m_ControlList.InsertColumnL(1, "PID", LVCFMT_LEFT, 70); @@ -227,6 +228,8 @@ void CSystemDlg::ShowWindowsList(void) lvc.pszText = str.GetBuffer(0); lvc.cchTextMax = str.GetLength(); m_ControlList.SetColumn(1, &lvc); + + ApplySort(); // 应用记忆的排序偏好 } void CSystemDlg::ShowProcessList(void) @@ -273,6 +276,8 @@ void CSystemDlg::ShowProcessList(void) lvc.pszText = str.GetBuffer(0); lvc.cchTextMax = str.GetLength(); m_ControlList.SetColumn(2, &lvc); //在列表中显示有多少个进程 + + ApplySort(); // 应用记忆的排序偏好 } @@ -319,8 +324,6 @@ int CALLBACK CSystemDlg::CompareFunction(LPARAM lParam1, LPARAM lParam2, LPARAM void CSystemDlg::SortByColumn(int nColumn) { - static int m_nSortColumn = 0; - static bool m_bSortAscending = false; if (nColumn == m_nSortColumn) { // 如果点击的是同一列,切换排序顺序 m_bSortAscending = !m_bSortAscending; @@ -330,11 +333,56 @@ void CSystemDlg::SortByColumn(int nColumn) m_bSortAscending = true; } + ApplySort(); + SaveSortPreference(); +} + +void CSystemDlg::ApplySort() +{ + // 无有效排序偏好时保持列表原始顺序 + if (m_nSortColumn < 0) { + return; + } + + // 防御:配置被手动修改导致列索引越界时跳过排序 + CHeaderCtrl* pHeader = m_ControlList.GetHeaderCtrl(); + if (pHeader && m_nSortColumn >= pHeader->GetItemCount()) { + return; + } + // 创建排序信息 std::pair sortInfo(m_nSortColumn, m_bSortAscending); m_ControlList.SortItems(CompareFunction, reinterpret_cast(&sortInfo)); } +void CSystemDlg::LoadSortPreference() +{ + // 进程管理 / 窗口管理 分别记忆各自的排序偏好 + const char* key = (m_bHow == TOKEN_PSLIST) ? "ProcessListSort" : "WindowListSort"; + std::string val = THIS_CFG.GetStr("list", key, ""); + if (val.empty()) { + m_nSortColumn = -1; // 无偏好:保持列表原始顺序 + m_bSortAscending = true; + return; + } + + auto arr = StringToVector(val, ','); + if (arr.size() >= 2) { + m_nSortColumn = atoi(arr[0].c_str()); + m_bSortAscending = (atoi(arr[1].c_str()) != 0); + } else { + m_nSortColumn = -1; + m_bSortAscending = true; + } +} + +void CSystemDlg::SaveSortPreference() +{ + const char* key = (m_bHow == TOKEN_PSLIST) ? "ProcessListSort" : "WindowListSort"; + std::string val = std::to_string(m_nSortColumn) + "," + (m_bSortAscending ? "1" : "0"); + THIS_CFG.SetStr("list", key, val); +} + void CSystemDlg::OnHdnItemclickList(NMHDR* pNMHDR, LRESULT* pResult) { LPNMHEADER pNMHeader = reinterpret_cast(pNMHDR); diff --git a/server/2015Remote/SystemDlg.h b/server/2015Remote/SystemDlg.h index f2219c0..555eeea 100644 --- a/server/2015Remote/SystemDlg.h +++ b/server/2015Remote/SystemDlg.h @@ -19,6 +19,8 @@ public: void OnReceiveComplete(void); CWnd* m_pParent; BOOL m_bHow; + int m_nSortColumn = -1; // 当前排序列,-1 表示未排序 + bool m_bSortAscending = true; // 排序方向(true=升序) // 对话框数据 enum { IDD = IDD_DIALOG_SYSTEM }; @@ -32,6 +34,9 @@ public: void DeleteAllItems(); void SortByColumn(int nColumn); + void ApplySort(); + void LoadSortPreference(); + void SaveSortPreference(); afx_msg VOID OnHdnItemclickList(NMHDR* pNMHDR, LRESULT* pResult); static int CALLBACK CompareFunction(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);