S
Danke!
aber so ganz hab ich das ganze noch nicht durchschaut, vielleicht darf ich dir meinen code mal zeigen. kannst mir vielleicht sagen wo ich was einfügen muss, das wäre echt nett. dieser code ist nämlich auch nicht von mir, muss ihn aber um diese funktion erweitern.
// TasksProcessesPage.cpp : implementation file
//
#include "stdafx.h"
#include "SystemMonitor.h"
#include "SystemMonitorDlg.h"
#include "TasksProcessesPage.h"
#include "Tlhelp32.h"
#include <Winbase.h>
#include <windows.h>
#include "psapi.h"
// CTasksProcessesPage dialog
IMPLEMENT_DYNAMIC(CTasksProcessesPage, CDialogEx)
CTasksProcessesPage::CTasksProcessesPage()
: CDialogEx(CTasksProcessesPage::IDD)
{
}
CTasksProcessesPage::~CTasksProcessesPage()
{
}
void CTasksProcessesPage::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_processes);
DDX_Control(pDX, IDC_LIST2, m_modules);
}
BEGIN_MESSAGE_MAP(CTasksProcessesPage, CDialogEx)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST2, OnLvnItemchangedList2)
ON_MESSAGE(WM_WORKERTHREAD_UPDATE, OnWorkerThreadUpdate)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, OnLvnItemchangedList1)
END_MESSAGE_MAP()
// CTasksProcessesPage message handlers
BOOL CTasksProcessesPage::OnInitDialog()
{
CDialog::OnInitDialog();
m_processes.InsertColumn(0,"Process name");
m_processes.InsertColumn(1,"ID");
m_processes.InsertColumn(2,"Threads");
m_processes.InsertColumn(3,"Priority");
m_processes.InsertColumn(4,"CPU Time");
m_processes.InsertColumn(5,"Memory Usage");
m_processes.InsertColumn(6,"Main Window Title");
m_processes.SetColumnWidth(0,120);
m_processes.SetColumnWidth(1,40);
m_processes.SetColumnWidth(2,60);
m_processes.SetColumnWidth(3,50);
m_processes.SetColumnWidth(4,60);
m_processes.SetColumnWidth(5,100);
m_processes.SetColumnWidth(6,200);
m_modules.InsertColumn(0,"Name");
m_modules.InsertColumn(1,"Path");
m_modules.SetColumnWidth(0,120);
m_modules.SetColumnWidth(1,310);
return TRUE;
}
LONG CTasksProcessesPage::OnWorkerThreadUpdate(WPARAM wParam, LPARAM lParam)
{
CWorkerThreadData data=m_Parent->GetWorkerThreadData();
CArray<bool,bool> valid; // array if item on position is still valid
for (int i=0; i<m_processes.GetItemCount(); i++) {
valid.Add(false);
}
POSITION pos=data.m_processList.GetHeadPosition();
for(int i=0;i<data.m_processList.GetCount();i++)
{
CProcessInformation pi=data.m_processList.GetNext(pos);
int pos;
// check if item is already in the list
bool found=false;
for (int j=0; j<m_processes.GetItemCount(); j++) {
if (pi.id==m_processes.GetItemData(j)) {
pos=j;
found=true;
break;
}
}
if (!found) {
// add the new item
m_processes.InsertItem(valid.GetCount(),pi.m_processName);
pos=valid.GetCount();
valid.Add(true);
}
// update the item data
m_processes.SetItemData(pos,pi.id);
m_processes.SetItemText(pos,0,pi.m_processName);
m_processes.SetItemText(pos,1,pi.m_processId);
m_processes.SetItemText(pos,2,pi.m_processCntThreads);
m_processes.SetItemText(pos,3,pi.m_processPriority);
CString temp;
int mins=pi.m_processCPUTime/60;
int secs=pi.m_processCPUTime%60;
temp.Format("%2.2d:%2.2d",mins,secs);
m_processes.SetItemText(pos,4,temp);
m_processes.SetItemText(pos,5,pi.m_processMemoryUsage);
m_processes.SetItemText(pos,6,pi.m_windowTitle);
valid[pos]=true;
}
// remove all items which are no longer present
for (int i=valid.GetCount()-1; i>=0; i--) {
if (!valid[i]) {
m_processes.DeleteItem(i);
}
}
return 0;
}
void CTasksProcessesPage::OnLvnItemchangedList2(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
*pResult = 0;
}
void CTasksProcessesPage::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
HANDLE hModuleSnap;
MODULEENTRY32 mEntry;
char help[200]; //18.6.
CList<MODULEENTRY32,MODULEENTRY32> m_moduleList;
if (pNMLV->uNewState&LVIS_SELECTED) {
//get the process the user has clicked
int changed=pNMLV->iItem;
DWORD id=m_processes.GetItemData(changed);
//remove elements from m_moduleList
m_moduleList.RemoveAll();
//delete modules in list
m_modules.DeleteAllItems();
//take a snapshot of the current process' modules
hModuleSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,id);
//store modules in m_moduleList
if(Module32First(hModuleSnap, &mEntry))
{
do
{
m_moduleList.AddTail(mEntry);
}
while(Module32Next(hModuleSnap,&mEntry));
}
CloseHandle(hModuleSnap);
if(m_moduleList.IsEmpty())
{
//insert dummy element
sprintf(help,"%s","DummyItem");
m_modules.InsertItem(0,help);
m_modules.SetItemText(0,0,"Keine Module geladen");
} else {
//run through m_moduleList
POSITION pos=m_moduleList.GetHeadPosition();
for(int i=0;i<m_moduleList.GetCount();i++)
{
mEntry=m_moduleList.GetNext(pos);
sprintf(help,"%d",mEntry.th32ModuleID);
m_modules.InsertItem(i,help);
sprintf(help,"%s",mEntry.szModule);
m_modules.SetItemText(i,0,mEntry.szModule);
m_modules.SetItemText(i,1,mEntry.szExePath);
}
}
}
*pResult = 0;
}