⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 进程模块查看 < 多任务(多进程、多线程) >
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "main.h"
//-------------------------------------------------------------------------
#define WindowClass		"TaskViewClass"		//窗口类名
#define WindowTitle		"进程模块管理"		//窗口标题
//-------------------------------------------------------------------------
HINSTANCE	g_hInst = NULL;
HWND		g_hWnd	= NULL;
HWND		g_hTree,g_hList;
HTREEITEM	g_hRoot,g_hCurr;
THEVEC		g_mv,g_mvUnload; 
HIMAGELIST  g_ImageList = NULL;
DWORD		g_dwHotPid = 0;
char		g_sHotName[NOR_SIZE];
//-------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
				   LPSTR lpCmdLine,int nCmdShow )
{
	MSG msg;
	//提升当前进程为 Debug 权限,可挂接、强杀系统进程
	EnableDebugPrivilege();
	//
	g_hInst = hInstance;
	if( !InitApplication(hInstance) ) return 0;
	if( !InitInstance(hInstance,nCmdShow) ) return 0;
	//
	while( GetMessage(&msg,NULL,0,0) ) 
	{
		TranslateMessage( &msg );
		DispatchMessage( &msg );
	}
	return msg.wParam;
}
//-------------------------------------------------------------------------
bool InitApplication(HINSTANCE hInstance)
{
	WNDCLASS wc;	
	// 注册主窗口类
	wc.style = 0;
	wc.lpfnWndProc = (WNDPROC)MainWndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.hIcon = LoadIcon( hInstance,(LPCTSTR)IDI_ICON_MAIN );
	wc.hCursor = LoadCursor( NULL,IDC_ARROW );
	wc.hbrBackground = (HBRUSH)GetStockObject( LTGRAY_BRUSH );
	wc.lpszMenuName = (LPCTSTR)IDR_MENU_MAIN;
	wc.lpszClassName = (LPCTSTR)WindowClass;
	if( !RegisterClass( &wc ) ) return false;
	return true;
}
//-------------------------------------------------------------------------
bool InitInstance(HINSTANCE hInstance,int nCmdShow)
{
	// 创建主窗口
	g_hWnd = CreateWindow(
		(LPCTSTR)WindowClass,
		(LPCTSTR)WindowTitle,
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL,
		NULL,
		hInstance,
		NULL );
	if( NULL==g_hWnd ) return false;
	//创建目录树子窗口
	InitCommonControls();
	g_hTree = CreateWindow(
			WC_TREEVIEW,
			"",
			WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_CHILD | 
			TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT | WS_EX_CLIENTEDGE, // 奇怪: TreeCtrl 下划线
			0,
			0,
			0,
			0,
			g_hWnd,
			NULL,
			hInstance,
			NULL );
	if( NULL==g_hTree ) return false;
	//创建list
	g_hList = CreateWindow(
			WC_LISTVIEW,
			"",
			WS_VSCROLL | WS_BORDER | WS_VISIBLE | WS_CHILD | LVS_REPORT,
			0,
			0,
			0,
			0,
			g_hWnd,
			NULL,
			hInstance,
			NULL );
	if( NULL==g_hList ) return false;
	ListView_SetExtendedListViewStyle( g_hList,LVS_EX_FULLROWSELECT ); 
	
	ShowWindow( g_hWnd,nCmdShow );
	UpdateWindow( g_hWnd );
	
	InitAllData( 0 );

	return true;
}
//-------------------------------------------------------------------------
void InitAllData(int iFlag)
{ 
	int i;
	switch( iFlag )
	{
	case 0:
		InitList();
		InitImageList();
		//注意:没有break,继续执行下面的代码
	case 1:
		EnumProcess( NULL );
		InitTreeData();
		InitListData( NULL );
		break;
	case 2: //替换部分 vector 数据,未完成,改为先删后增,简单点
		for( i=0;i<g_mv.size();i++ )
		{
			if( g_mv[i].pid==g_dwHotPid )
			{
				g_mv.erase( g_mv.begin()+i );
			}
		}
		EnumProcess( g_sHotName );
		InitListData( g_sHotName );
		break;
	}
}

void ClearAllData()
{
	for( int i=0;i<g_mv.size();i++ )
		g_mv[i].v.clear();

	g_mv.clear();
}
//-------------------------------------------------------------------------
LRESULT CALLBACK MainWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	RECT r;
	NM_TREEVIEW *nmptr;
	NM_LISTVIEW *nmlvw;
	TV_ITEM tvi;
	char str[MAX_SIZE];
	int i,nItem;

	switch( uMsg )
	{
	case WM_CREATE:		
		RegisterHotKey( hWnd,IDC_A,NULL,VK_F6 );
		RegisterHotKey( hWnd,IDC_B,NULL,VK_F5 );
		RegisterHotKey( hWnd,IDC_E,NULL,VK_F3 );
		RegisterHotKey( hWnd,IDC_C,NULL,VK_DELETE );
		RegisterHotKey( hWnd,IDC_D,NULL,VK_ESCAPE );
		break;
	case WM_SIZE:
		GetClientRect( hWnd,&r );
		MoveWindow( g_hTree,0,0,r.right/3,r.bottom,true );
		ShowWindow( g_hTree,SW_SHOW );
		MoveWindow( g_hList,r.right/3+1,0,r.right-r.right/3-1,r.bottom,true );
		ShowWindow( g_hList,SW_SHOW );
		break;
	case WM_COMMAND:
		switch( LOWORD(wParam) ) 
		{
		case IDM_PRC_RUN:
			RunSysDlg();
			InitAllData( 1 );
			break;
		case IDM_PRC_KILL:
			if( KillProcess() )
			{
				//等待 Kill 完毕,某些进程可能时间会长点,刷新就会还在
				Sleep( DELAYTIME );
				PostMessage( hWnd,WM_COMMAND,IDM_PRC_REFRESH,0 );
			}
			break;
		case IDM_PRC_REFRESH:
			InitAllData( 1 );
			break;
		case IDM_MUD_SEARCH:
			DialogBox( g_hInst,MAKEINTRESOURCE(IDD_DLG_SEARCH),hWnd,(DLGPROC)DlgSeachProc);
			break;
		case IDM_MUD_PROP:
			if( ListView_GetSelectedCount(g_hList)<=0 ) return false;
			for( i=0;i<ListView_GetItemCount(g_hList);i++ )
			{
				if( ListView_GetItemState(g_hList,i,LVIS_SELECTED) )
				{
					ListView_GetItemText( g_hList,i,1,str,MAX_SIZE );
					ShowFileAttr( str );
					break;
				}
			}
			break;
		case IDM_MUD_UNLOAD:
			CheckAndUnload();
			break;
		case IDM_ABOUT:
			DialogBox( g_hInst,MAKEINTRESOURCE(IDD_ABOUTBOX),hWnd,(DLGPROC)DlgAboutProc);
			break;
		case IDM_EXIT:
			PostMessage( hWnd,WM_DESTROY,0,0 );
			break;
		}
		break;
	case WM_HOTKEY:
		switch( (int) wParam )
		{
		case IDC_A:
			PostMessage( hWnd,WM_COMMAND,IDM_PRC_KILL,0 );
			break;
		case IDC_B:
			PostMessage( hWnd,WM_COMMAND,IDM_PRC_REFRESH,0 );
			break;
		case IDC_C:
			PostMessage( hWnd,WM_COMMAND,IDM_MUD_UNLOAD,0 );
			break;
		case IDC_D:
			PostMessage( hWnd,WM_DESTROY,0,0 );
			break;
		case IDC_E:
			PostMessage( hWnd,WM_COMMAND,IDM_MUD_SEARCH,0 );
			break;
		}
		break;
	case WM_NOTIFY:
		if( ((LPNMHDR)lParam)->hwndFrom==g_hTree )
		{
			nmptr = (NM_TREEVIEW *)(LPARAM)lParam;
			//树选择
			if( nmptr->hdr.code==TVN_SELCHANGED ) 
			{
				g_hCurr = nmptr->itemNew.hItem;
				if(g_hCurr==g_hRoot)
				{
					InitListData( NULL );
					strcpy( g_sHotName,"" );
					g_dwHotPid = 0;
				}
				else
				{
					tvi.hItem = g_hCurr;
					tvi.mask = TVIF_TEXT | TVIF_HANDLE | TVIF_IMAGE;
					tvi.pszText = str;
					tvi.cchTextMax = MAX_SIZE;
					TreeView_GetItem( g_hTree,&tvi );
					InitListData( str );
					strcpy( g_sHotName,str );
					g_dwHotPid = GetPrcIdMem( g_sHotName );
				}
			}
		}
		else if( ((LPNMHDR)lParam)->hwndFrom==g_hList )
		{
			nmlvw = (NM_LISTVIEW *)(LPARAM)lParam;
			if( nmlvw->hdr.code==NM_DBLCLK )
			{
				nItem = nmlvw->iItem;
				ListView_GetItemText( g_hList,nItem,1,str,MAX_SIZE );
				ShowFileAttr( str );
			}
		}
		break;
	case WM_DESTROY:
		ClearAllData();
		UnregisterHotKey( hWnd,IDC_A );
		UnregisterHotKey( hWnd,IDC_B );
		UnregisterHotKey( hWnd,IDC_C );
		UnregisterHotKey( hWnd,IDC_D );
		PostQuitMessage( 0 );
		break;
	default:
		return DefWindowProc( hWnd,uMsg,wParam,lParam );
	}
	//调用缺省消息处理过程
    return DefWindowProc( hWnd,uMsg,wParam,lParam );
}
//-------------------------------------------------------------------------
LRESULT CALLBACK DlgAboutProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDOK:	//ENTER
		case IDCANCEL:	//ESCAPE
			EndDialog( hWnd,0 );
			return true;
		}
	}
	return false;
}
LRESULT CALLBACK DlgSeachProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	HWND hList,hEdit;
	LVCOLUMN lv;
	LVITEM lvi;
	int i,j,nItem;
	char str[MAX_SIZE],sTmp[MAX_SIZE]; 
	static int iTag = 0;
	PROCESSINFO p;

	switch (uMsg)
	{
	case WM_INITDIALOG:
		hEdit = GetDlgItem( hWnd,IDC_EDIT_SEARCH );
		SetWindowText( hEdit,"gdi32.dll" ); //例子
		hList = GetDlgItem( hWnd,IDC_LIST_MODULE );
		ListView_SetExtendedListViewStyle( hList,LVS_REPORT|LVS_EX_FULLROWSELECT|LVS_EX_CHECKBOXES ); 		
		lv.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
		lv.fmt	= LVCFMT_LEFT;	
		lv.cx	= 200;
		lv.pszText = "模块名称";
		SendMessage( hList,LVM_INSERTCOLUMN,(WPARAM)(int)0,(LPARAM)(const LPLVCOLUMN)&lv );
		lv.cx	= 300;
		lv.pszText = "所在进程";
		SendMessage( hList,LVM_INSERTCOLUMN,(WPARAM)(int)1,(LPARAM)(const LPLVCOLUMN)&lv );
		lv.cx	= 0;
		lv.pszText = "模块路径";
		SendMessage( hList,LVM_INSERTCOLUMN,(WPARAM)(int)2,(LPARAM)(const LPLVCOLUMN)&lv );
		lv.cx	= 0;
		lv.pszText = "进程PID";
		SendMessage( hList,LVM_INSERTCOLUMN,(WPARAM)(int)3,(LPARAM)(const LPLVCOLUMN)&lv );
		break;
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDOK:	//ENTER
		case IDCANCEL:	//ESCAPE
		case IDC_BTN_EXIT:
			EndDialog( hWnd,0 );
			return true;
		case IDC_BTN_SEARCH:
			hList = GetDlgItem( hWnd,IDC_LIST_MODULE );
			hEdit = GetDlgItem( hWnd,IDC_EDIT_SEARCH );
			GetWindowText( hEdit,str,NOR_SIZE );
			if( strlen(str)<=0 ) return false;
			strcpy( sTmp,str );
			ListView_DeleteAllItems( hList );
			for( i=0;i<g_mv.size();i++ )
			{
				for( j=0;j<g_mv[i].v.size();j++ )
				{
					strcpy( str,sTmp );
					if( lstrcmpi(g_mv[i].v[j].name,str)==0 )
					{						
						lvi.mask	= LVIF_TEXT; 
						lvi.iItem	= i;
						lvi.iSubItem= 0;
						lvi.pszText = str;
						nItem = ListView_InsertItem( hList,&lvi );
						ListView_SetItemText( hList,nItem,1,g_mv[i].name );
						ListView_SetItemText( hList,nItem,2,g_mv[i].v[j].path );
						sprintf( str,"%d",g_mv[i].pid );
						ListView_SetItemText( hList,nItem,3,str );
					}
				}
			}
			break;
		case IDC_BTN_SELALL:
			hList = GetDlgItem( hWnd,IDC_LIST_MODULE );
			if( iTag==0 ) 
				iTag = 1;
			else
				iTag = 0;
			//
			for( i=0;i<ListView_GetItemCount(hList);i++ )
			{
				ListView_SetCheckState( hList,i,iTag );
			}
			break;
		case IDC_BTN_UNLOAD:
			hList = GetDlgItem( hWnd,IDC_LIST_MODULE );
			j = ListView_GetItemCount( hList );
			if( j<=0 ) return false;
			g_mvUnload.clear();
			for( i=0;i<j;i++ )
			{
				if( ListView_GetCheckState(hList,i) )
				{
					ListView_GetItemText( hList,i,1,str,MAX_SIZE );
					strcpy(	p.path,str ); 
					ListView_GetItemText( hList,i,3,str,MAX_SIZE );
					p.pid = atoi( str );
					g_mvUnload.push_back( p );
				}
			}
			if( g_mvUnload.size()<=0 ) return false;
			UnloadModules();
			PostMessage( hWnd,WM_COMMAND,IDOK,0 );
			break;
		}
	}
	return false;
}
//-------------------------------------------------------------------------
void InitList()
{
	LVCOLUMN lv;
	lv.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
	lv.fmt	= LVCFMT_LEFT;	
	lv.cx	= 150;
	lv.pszText = "项目";
	SendMessage( g_hList,LVM_INSERTCOLUMN,(WPARAM)(int)0,(LPARAM)(const LPLVCOLUMN)&lv );
	lv.cx	= 550;
	lv.pszText = "值";	
	SendMessage( g_hList,LVM_INSERTCOLUMN,(WPARAM)(int)1,(LPARAM)(const LPLVCOLUMN)&lv );
}
//-------------------------------------------------------------------------
void InitListData(LPCTSTR sTarget)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -