feature: #26 Support sorting for processes and windows

This commit is contained in:
yuanyuanxiang
2025-01-10 00:39:18 +08:00
parent 077df93a68
commit 1942f499e3
2 changed files with 87 additions and 13 deletions

View File

@@ -9,6 +9,15 @@
// CSystemDlg <20>Ի<EFBFBD><D4BB><EFBFBD>
typedef struct
{
DWORD ID;
CString Data[3];
CString GetData(int index)const {
return Data[index];
}
}ItemData;
enum
{
COMMAND_WINDOW_CLOSE, //<2F>رմ<D8B1><D5B4><EFBFBD>
@@ -39,6 +48,7 @@ void CSystemDlg::DoDataExchange(CDataExchange* pDX)
BEGIN_MESSAGE_MAP(CSystemDlg, CDialog)
ON_WM_CLOSE()
ON_NOTIFY(NM_RCLICK, IDC_LIST_SYSTEM, &CSystemDlg::OnNMRClickListSystem)
ON_NOTIFY(HDN_ITEMCLICK, 0, &CSystemDlg::OnHdnItemclickList)
ON_COMMAND(ID_PLIST_KILL, &CSystemDlg::OnPlistKill)
ON_COMMAND(ID_PLIST_REFRESH, &CSystemDlg::OnPlistRefresh)
ON_COMMAND(ID_WLIST_REFRESH, &CSystemDlg::OnWlistRefresh)
@@ -95,7 +105,7 @@ void CSystemDlg::ShowWindowsList(void)
char *szTitle = NULL;
bool isDel=false;
m_ControlList.DeleteAllItems();
DeleteAllItems();
CString str;
int i ;
for ( i = 0; dwOffset <m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1; ++i)
@@ -107,7 +117,8 @@ void CSystemDlg::ShowWindowsList(void)
m_ControlList.SetItemText(i, 1, szTitle);
m_ControlList.SetItemText(i, 2, "<EFBFBD><EFBFBD>ʾ"); //(d) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC>ʾΪ "<22><>ʾ"
// ItemData Ϊ<><CEAA><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>
m_ControlList.SetItemData(i, *lpPID); //(d)
auto data = new ItemData{ *lpPID, {str, szTitle,"<EFBFBD><EFBFBD>ʾ"} };
m_ControlList.SetItemData(i, (DWORD_PTR)data); //(d)
dwOffset += sizeof(DWORD) + lstrlen(szTitle) + 1;
}
str.Format("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD>%d<><64>", i); //<2F>޸<EFBFBD>CtrlList
@@ -126,7 +137,7 @@ void CSystemDlg::ShowProcessList(void)
char *szProcessFullPath;
DWORD dwOffset = 0;
CString str;
m_ControlList.DeleteAllItems();
DeleteAllItems();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿһ<C3BF><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ<DDBD><E1B9B9> Id+<2B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+0+<2B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+0
int i;
for (i = 0; dwOffset < m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1; ++i)
@@ -141,7 +152,8 @@ void CSystemDlg::ShowProcessList(void)
m_ControlList.SetItemText(i, 1, str);
m_ControlList.SetItemText(i, 2, szProcessFullPath);
// ItemData Ϊ<><CEAA><EFBFBD><EFBFBD>ID
m_ControlList.SetItemData(i, *PID);
auto data = new ItemData{ *PID, {szExeFile, str, szProcessFullPath} };
m_ControlList.SetItemData(i, DWORD_PTR(data));
dwOffset += sizeof(DWORD) + lstrlen(szExeFile) + lstrlen(szProcessFullPath) + 2; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ѭ<EFBFBD><D1AD>
}
@@ -161,6 +173,7 @@ void CSystemDlg::OnClose()
#if CLOSE_DELETE_DLG
m_ContextObject->v1 = 0;
#endif
DeleteAllItems();
CancelIo((HANDLE)m_ContextObject->sClientSocket);
closesocket(m_ContextObject->sClientSocket);
CDialog::OnClose();
@@ -169,6 +182,57 @@ void CSystemDlg::OnClose()
#endif
}
// <20>ͷ<EFBFBD><CDB7><EFBFBD>Դ<EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void CSystemDlg::DeleteAllItems() {
for (int i = 0; i < m_ControlList.GetItemCount(); i++)
{
auto data = (ItemData*)m_ControlList.GetItemData(i);
if (NULL != data) {
delete data;
}
}
m_ControlList.DeleteAllItems();
}
int CALLBACK CSystemDlg::CompareFunction(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) {
auto* pSortInfo = reinterpret_cast<std::pair<int, bool>*>(lParamSort);
int nColumn = pSortInfo->first;
bool bAscending = pSortInfo->second;
// <20><>ȡ<EFBFBD><C8A1>ֵ
ItemData* context1 = (ItemData*)lParam1;
ItemData* context2 = (ItemData*)lParam2;
CString s1 = context1->GetData(nColumn);
CString s2 = context2->GetData(nColumn);
int result = s1.Compare(s2);
return bAscending ? result : -result;
}
void CSystemDlg::SortByColumn(int nColumn) {
static int m_nSortColumn = 0;
static bool m_bSortAscending = false;
if (nColumn == m_nSortColumn) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬһ<CDAC>У<EFBFBD><D0A3>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3>
m_bSortAscending = !m_bSortAscending;
}
else {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
m_nSortColumn = nColumn;
m_bSortAscending = true;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
std::pair<int, bool> sortInfo(m_nSortColumn, m_bSortAscending);
m_ControlList.SortItems(CompareFunction, reinterpret_cast<LPARAM>(&sortInfo));
}
void CSystemDlg::OnHdnItemclickList(NMHDR* pNMHDR, LRESULT* pResult) {
LPNMHEADER pNMHeader = reinterpret_cast<LPNMHEADER>(pNMHDR);
int nColumn = pNMHeader->iItem; // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SortByColumn(nColumn); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*pResult = 0;
}
void CSystemDlg::OnNMRClickListSystem(NMHDR *pNMHDR, LRESULT *pResult)
{
@@ -226,7 +290,8 @@ void CSystemDlg::OnPlistKill()
while(Pos)
{
int nItem = ListCtrl->GetNextSelectedItem(Pos);
DWORD dwProcessID = ListCtrl->GetItemData(nItem);
auto data = (ItemData*)ListCtrl->GetItemData(nItem);
DWORD dwProcessID = data->ID;
memcpy(szBuffer + dwOffset, &dwProcessID, sizeof(DWORD)); //sdkfj101112
dwOffset += sizeof(DWORD);
}
@@ -244,7 +309,7 @@ VOID CSystemDlg::OnPlistRefresh()
{
if (m_ControlList.IsWindowVisible())
{
m_ControlList.DeleteAllItems();
DeleteAllItems();
GetProcessList();
ShowProcessList();
}
@@ -306,8 +371,8 @@ void CSystemDlg::OnWlistClose()
ZeroMemory(lpMsgBuf,20);
lpMsgBuf[0]=COMMAND_WINDOW_CLOSE; //ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD>ͷ
DWORD hwnd = pListCtrl->GetItemData(nItem); //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ڵľ<DAB5><C4BE><EFBFBD>һͬ<D2BB><CDAC><EFBFBD><EFBFBD> 4 djfkdfj dkfjf 4
auto data = (ItemData*)pListCtrl->GetItemData(nItem);
DWORD hwnd = data->ID; //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ڵľ<DAB5><C4BE><EFBFBD>һͬ<D2BB><CDAC><EFBFBD><EFBFBD> 4 djfkdfj dkfjf 4
memcpy(lpMsgBuf+1,&hwnd,sizeof(DWORD)); //1 4
m_iocpServer->OnClientPreSending(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf));
@@ -326,7 +391,8 @@ void CSystemDlg::OnWlistHide()
{
ZeroMemory(lpMsgBuf,20);
lpMsgBuf[0]=COMMAND_WINDOW_TEST; //<2F><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ
DWORD hwnd = pListCtrl->GetItemData(nItem); //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ڵľ<DAB5><C4BE><EFBFBD>һͬ<D2BB><CDAC><EFBFBD><EFBFBD>
auto data = (ItemData*)pListCtrl->GetItemData(nItem);
DWORD hwnd = data->ID; //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ڵľ<DAB5><C4BE><EFBFBD>һͬ<D2BB><CDAC><EFBFBD><EFBFBD>
pListCtrl->SetItemText(nItem,2,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"); //ע<><D7A2><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>б<EFBFBD><D0B1>е<EFBFBD><D0B5><EFBFBD>ʾ״̬Ϊ"<22><><EFBFBD><EFBFBD>"
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD>б<EFBFBD><D0B1><EFBFBD>Ŀʱ<C4BF>Ͳ<EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ھ<EFBFBD><DABE><EFBFBD><EFBFBD>ᶪʧ <20><><EFBFBD><EFBFBD>ԶҲ<D4B6><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>
memcpy(lpMsgBuf+1,&hwnd,sizeof(DWORD)); //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ڵľ<DAB5><C4BE><EFBFBD>һͬ<D2BB><CDAC><EFBFBD><EFBFBD>
@@ -348,7 +414,8 @@ void CSystemDlg::OnWlistRecover()
{
ZeroMemory(lpMsgBuf,20);
lpMsgBuf[0]=COMMAND_WINDOW_TEST;
DWORD hwnd = pListCtrl->GetItemData(nItem);
auto data = (ItemData*)pListCtrl->GetItemData(nItem);
DWORD hwnd = data->ID;
pListCtrl->SetItemText(nItem,2,"<EFBFBD><EFBFBD>ʾ");
memcpy(lpMsgBuf+1,&hwnd,sizeof(DWORD));
DWORD dHow=SW_NORMAL;
@@ -369,7 +436,8 @@ void CSystemDlg::OnWlistMax()
{
ZeroMemory(lpMsgBuf,20);
lpMsgBuf[0]=COMMAND_WINDOW_TEST;
DWORD hwnd = pListCtrl->GetItemData(nItem);
auto data = (ItemData*)pListCtrl->GetItemData(nItem);
DWORD hwnd = data->ID;
pListCtrl->SetItemText(nItem,2,"<EFBFBD><EFBFBD>ʾ");
memcpy(lpMsgBuf+1,&hwnd,sizeof(DWORD));
DWORD dHow=SW_MAXIMIZE;
@@ -390,12 +458,12 @@ void CSystemDlg::OnWlistMin()
{
ZeroMemory(lpMsgBuf,20);
lpMsgBuf[0]=COMMAND_WINDOW_TEST;
DWORD hwnd = pListCtrl->GetItemData(nItem);
auto data = (ItemData*)pListCtrl->GetItemData(nItem);
DWORD hwnd = data->ID;
pListCtrl->SetItemText(nItem,2,"<EFBFBD><EFBFBD>ʾ");
memcpy(lpMsgBuf+1,&hwnd,sizeof(DWORD));
DWORD dHow=SW_MINIMIZE;
memcpy(lpMsgBuf+1+sizeof(hwnd),&dHow,sizeof(DWORD));
m_iocpServer->OnClientPreSending(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf));
}
}