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
This commit is contained in:
@@ -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<int, bool> sortInfo(m_nSortColumn, m_bSortAscending);
|
||||
m_ControlList.SortItems(CompareFunction, reinterpret_cast<LPARAM>(&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<LPNMHEADER>(pNMHDR);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user