?? main.cpp
字號(hào):
#include "main.h"
//-------------------------------------------------------------------------
#define WindowClass "TaskViewClass" //窗口類(lèi)名
#define WindowTitle "進(jìn)程模塊管理" //窗口標(biāo)題
//-------------------------------------------------------------------------
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;
//提升當(dāng)前進(jìn)程為 Debug 權(quán)限,可掛接、強(qiáng)殺系統(tǒng)進(jìn)程
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;
// 注冊(cè)主窗口類(lèi)
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)
{
// 創(chuàng)建主窗口
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;
//創(chuàng)建目錄樹(shù)子窗口
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;
//創(chuàng)建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();
//注意:沒(méi)有break,繼續(xù)執(zhí)行下面的代碼
case 1:
EnumProcess( NULL );
InitTreeData();
InitListData( NULL );
break;
case 2: //替換部分 vector 數(shù)據(jù),未完成,改為先刪后增,簡(jiǎn)單點(diǎn)
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 完畢,某些進(jìn)程可能時(shí)間會(huì)長(zhǎng)點(diǎn),刷新就會(huì)還在
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;
//樹(shù)選擇
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 );
}
//調(diào)用缺省消息處理過(guò)程
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 = "模塊名稱(chēng)";
SendMessage( hList,LVM_INSERTCOLUMN,(WPARAM)(int)0,(LPARAM)(const LPLVCOLUMN)&lv );
lv.cx = 300;
lv.pszText = "所在進(jìn)程";
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 = "進(jìn)程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 = "項(xiàng)目";
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)
{
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -