From 9d2e9ec8ca6df4123628d2f479a55ea517c55d0d Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Thu, 13 Aug 2026 12:59:29 +0200 Subject: [PATCH] Feature: Remember process/window list sort preference Persist the sort column and direction chosen via the list header so the next time the process or window management dialog opens it defaults to the same sort. Process and window lists are remembered separately (list\ProcessListSort and list\WindowListSort registry keys) since their columns have different meanings. Co-Authored-By: deepseek-v4-pro --- server/2015Remote/SystemDlg.cpp | 52 +++++++++++++++++++++++++++++++-- server/2015Remote/SystemDlg.h | 5 ++++ 2 files changed, 55 insertions(+), 2 deletions(-) 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);