feature: #26 Support sorting for processes and windows
This commit is contained in:
@@ -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));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user