feature: #27 Support sorting for service list
This commit is contained in:
@@ -304,6 +304,10 @@ reorg: Move commands to common/commands.h
|
|||||||
2024.12.31
|
2024.12.31
|
||||||
生成服务时增加加密选项,当前支持XOR加密。配合使用解密程序来加载加密后的服务。
|
生成服务时增加加密选项,当前支持XOR加密。配合使用解密程序来加载加密后的服务。
|
||||||
|
|
||||||
|
2024.01.12
|
||||||
|
修复被控程序关于远程桌面相关可能的2处问题(#28 #29)。增加对主控端列表窗口的排序功能(#26 #27),以便快速定位窗口、服务或进程。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# 沟通反馈
|
# 沟通反馈
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,14 @@
|
|||||||
|
|
||||||
IMPLEMENT_DYNAMIC(CServicesDlg, CDialog)
|
IMPLEMENT_DYNAMIC(CServicesDlg, CDialog)
|
||||||
|
|
||||||
|
// ItemData1 <20><>Ҫ<EFBFBD><D2AA>ItemDataͬ<61><CDAC><EFBFBD>ˣ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
typedef struct ItemData1
|
||||||
|
{
|
||||||
|
CString Data[5];
|
||||||
|
CString GetData(int index) const {
|
||||||
|
return this ? Data[index] : "";
|
||||||
|
}
|
||||||
|
} ItemData1;
|
||||||
|
|
||||||
CServicesDlg::CServicesDlg(CWnd* pParent, IOCPServer* IOCPServer, CONTEXT_OBJECT *ContextObject)
|
CServicesDlg::CServicesDlg(CWnd* pParent, IOCPServer* IOCPServer, CONTEXT_OBJECT *ContextObject)
|
||||||
: CDialog(CServicesDlg::IDD, pParent)
|
: CDialog(CServicesDlg::IDD, pParent)
|
||||||
@@ -39,6 +47,7 @@ BEGIN_MESSAGE_MAP(CServicesDlg, CDialog)
|
|||||||
ON_COMMAND(ID_SERVICES_START, &CServicesDlg::OnServicesStart)
|
ON_COMMAND(ID_SERVICES_START, &CServicesDlg::OnServicesStart)
|
||||||
ON_COMMAND(ID_SERVICES_REFLASH, &CServicesDlg::OnServicesReflash)
|
ON_COMMAND(ID_SERVICES_REFLASH, &CServicesDlg::OnServicesReflash)
|
||||||
ON_NOTIFY(NM_RCLICK, IDC_LIST, &CServicesDlg::OnNMRClickList)
|
ON_NOTIFY(NM_RCLICK, IDC_LIST, &CServicesDlg::OnNMRClickList)
|
||||||
|
ON_NOTIFY(HDN_ITEMCLICK, 0, &CServicesDlg::OnHdnItemclickList)
|
||||||
END_MESSAGE_MAP()
|
END_MESSAGE_MAP()
|
||||||
|
|
||||||
|
|
||||||
@@ -79,7 +88,7 @@ int CServicesDlg::ShowServicesList(void)
|
|||||||
char *szAutoRun;
|
char *szAutoRun;
|
||||||
char *szFilePath;
|
char *szFilePath;
|
||||||
DWORD dwOffset = 0;
|
DWORD dwOffset = 0;
|
||||||
m_ControlList.DeleteAllItems();
|
DeleteAllItems();
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (i = 0; dwOffset < m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1; ++i)
|
for (i = 0; dwOffset < m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1; ++i)
|
||||||
@@ -95,7 +104,8 @@ int CServicesDlg::ShowServicesList(void)
|
|||||||
m_ControlList.SetItemText(i, 2, szAutoRun);
|
m_ControlList.SetItemText(i, 2, szAutoRun);
|
||||||
m_ControlList.SetItemText(i, 3, szRunWay);
|
m_ControlList.SetItemText(i, 3, szRunWay);
|
||||||
m_ControlList.SetItemText(i, 4, szFilePath );
|
m_ControlList.SetItemText(i, 4, szFilePath );
|
||||||
|
auto data = new ItemData1{ szServiceName, szDisplayName, szAutoRun, szRunWay, szFilePath };
|
||||||
|
m_ControlList.SetItemData(i, (DWORD_PTR)data);
|
||||||
dwOffset += lstrlen(szDisplayName) + lstrlen(szServiceName) + lstrlen(szFilePath) + lstrlen(szRunWay)
|
dwOffset += lstrlen(szDisplayName) + lstrlen(szServiceName) + lstrlen(szFilePath) + lstrlen(szRunWay)
|
||||||
+ lstrlen(szAutoRun) +5;
|
+ lstrlen(szAutoRun) +5;
|
||||||
}
|
}
|
||||||
@@ -114,6 +124,7 @@ void CServicesDlg::OnClose()
|
|||||||
#if CLOSE_DELETE_DLG
|
#if CLOSE_DELETE_DLG
|
||||||
m_ContextObject->v1 = 0;
|
m_ContextObject->v1 = 0;
|
||||||
#endif
|
#endif
|
||||||
|
DeleteAllItems();
|
||||||
CancelIo((HANDLE)m_ContextObject->sClientSocket);
|
CancelIo((HANDLE)m_ContextObject->sClientSocket);
|
||||||
closesocket(m_ContextObject->sClientSocket);
|
closesocket(m_ContextObject->sClientSocket);
|
||||||
CDialog::OnClose();
|
CDialog::OnClose();
|
||||||
@@ -153,6 +164,57 @@ void CServicesDlg::OnServicesReflash()
|
|||||||
m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, 1);
|
m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// <20>ͷ<EFBFBD><CDB7><EFBFBD>Դ<EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
void CServicesDlg::DeleteAllItems() {
|
||||||
|
for (int i = 0; i < m_ControlList.GetItemCount(); i++)
|
||||||
|
{
|
||||||
|
auto data = (ItemData1*)m_ControlList.GetItemData(i);
|
||||||
|
if (NULL != data) {
|
||||||
|
delete data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_ControlList.DeleteAllItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
int CALLBACK CServicesDlg::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>ֵ
|
||||||
|
ItemData1* context1 = (ItemData1*)lParam1;
|
||||||
|
ItemData1* context2 = (ItemData1*)lParam2;
|
||||||
|
CString s1 = context1->GetData(nColumn);
|
||||||
|
CString s2 = context2->GetData(nColumn);
|
||||||
|
|
||||||
|
int result = s1 > s2 ? 1 : -1;
|
||||||
|
return bAscending ? result : -result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CServicesDlg::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 CServicesDlg::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 CServicesDlg::OnNMRClickList(NMHDR *pNMHDR, LRESULT *pResult)
|
void CServicesDlg::OnNMRClickList(NMHDR *pNMHDR, LRESULT *pResult)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -27,6 +27,12 @@ protected:
|
|||||||
public:
|
public:
|
||||||
CListCtrl m_ControlList;
|
CListCtrl m_ControlList;
|
||||||
virtual BOOL OnInitDialog();
|
virtual BOOL OnInitDialog();
|
||||||
|
|
||||||
|
void DeleteAllItems();
|
||||||
|
void SortByColumn(int nColumn);
|
||||||
|
afx_msg VOID OnHdnItemclickList(NMHDR* pNMHDR, LRESULT* pResult);
|
||||||
|
static int CALLBACK CompareFunction(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
|
||||||
|
|
||||||
CStatic m_ServicesCount;
|
CStatic m_ServicesCount;
|
||||||
afx_msg void OnClose();
|
afx_msg void OnClose();
|
||||||
afx_msg void OnServicesAuto();
|
afx_msg void OnServicesAuto();
|
||||||
|
|||||||
Reference in New Issue
Block a user