#include <windows.h>
#include <commctrl.h>
#include <tlhelp32.h>
#include <string.h>
#include "resource.h"
#pragma comment( lib, "comctl32.lib" )
#define IDC_STATUS WM_USER+1
BOOL __stdcall DlgProc( HWND, UINT, WPARAM, LPARAM );
void UpdateProcess( HWND hWndList );
int __stdcall WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
){
::InitCommonControls();
::DialogBoxParam(
hInstance,
(LPCTSTR)IDD_DIALOG1,
NULL,
DlgProc,
NULL
);
return 0;
}
BOOL __stdcall DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg )
{
case WM_INITDIALOG:
{
//初始化控件文本
::SendMessage( ::GetDlgItem(hDlg, IDC_INFORMATION ), WM_SETTEXT, 0, (LPARAM)"请双击您要关闭的进程!" );
::SendMessage( ::GetDlgItem(hDlg, ID_UPDATE ), WM_SETTEXT, 0, (long)"刷新" );
::SendMessage( ::GetDlgItem(hDlg, IDCANCEL ), WM_SETTEXT, 0, (long)"退出" );
//窗口居中
RECT rc;
int cxpoint, cypoint;
::GetWindowRect( hDlg, &rc );
cxpoint = rc.right - rc.left;
cypoint = rc.bottom - rc.top;
::SetWindowPos(hDlg, NULL, GetSystemMetrics(SM_CXSCREEN)/2-cxpoint/2, GetSystemMetrics(SM_CYSCREEN)/2-cypoint/2, 0, 0, SWP_NOSIZE );
HWND hWndList = ::GetDlgItem( hDlg, IDC_LIST1 );
::SendMessage( hWndList, LVM_SETEXTENDEDLISTVIEWSTYLE,
0, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES );
LVCOLUMN column;
column.mask = LVCF_TEXT|LVCF_FMT|LVCF_WIDTH;
column.cx = 180;
column.fmt = LVCFMT_CENTER;
column.pszText = "进程名称";
::SendMessage( hWndList, LVM_INSERTCOLUMN, 0, (LPARAM)&column );
column.pszText = "PID";
column.cx = 50;
::SendMessage( hWndList, LVM_INSERTCOLUMN, 1, (LPARAM)&column );
HWND hWndStatus = ::CreateStatusWindow(WS_CHILD|WS_VISIBLE|SBS_SIZEGRIP,
NULL, hDlg, IDC_STATUS );
::SendMessage( hWndStatus, SB_SETBKCOLOR, 0, RGB(0XA6, 0XCA, 0XF0) );
int pInt[] = {152, -1};
::SendMessage( hWndStatus, SB_SETTEXT, 0, (long)"准备就绪");
::SendMessage( hWndStatus, SB_SETTEXT, 1, (long)"windows程序进阶之路!" );
UpdateProcess( hWndList );
}
break;
case WM_COMMAND:
switch( LOWORD(wParam) )
{
case IDOK:
::EndDialog( hDlg, IDOK );
break;
case IDCANCEL:
::EndDialog( hDlg, IDCANCEL );
break;
case ID_UPDATE:
UpdateProcess( ::GetDlgItem( hDlg, IDC_LIST1 ) );
break;
}
//http://www.pythonschool.com
case WM_NOTIFY:
{
if( wParam == IDC_LIST1 )
{
NMHDR *pHeader = (LPNMHDR)lParam;
HWND hWndList = pHeader->hwndFrom;
if( pHeader->code == NM_DBLCLK )
{
NMLISTVIEW* pNMListView = (NMLISTVIEW*)pHeader;
int nIndex = pNMListView->iItem;
char szID[56];
LVITEM lvi;
memset( &lvi, 0, sizeof(LVITEM) );
lvi.iSubItem = 1;
lvi.cchTextMax = 56;
lvi.pszText = szID;
::SendMessage( hWndList, LVM_GETITEMTEXT, (WPARAM)nIndex, (long)&lvi );
if( ::MessageBox( hDlg, "是否终止进程?", "ComctlDlg", MB_OKCANCEL|MB_DEFBUTTON2 ) == IDCANCEL )
return 0;
HANDLE hProcess = ::OpenProcess( PROCESS_TERMINATE, FALSE, atoi( szID) );
if( hProcess != NULL )
{
HWND hWndStatus = ::GetDlgItem( hDlg, IDC_STATUS );
if( ::TerminateProcess( hProcess, 0) )
{
::SendMessage( hWndStatus, SB_SETTEXT, 0, (long)"终止进程成功" );
UpdateProcess( hWndList );
}
else
{
::SendMessage( hWndStatus, SB_SETTEXT, 0, (long)"终止进程失败" );
}
}
}
}
}
break;
}
return FALSE;
}
void UpdateProcess( HWND hWndList )
{
::SendMessage( hWndList, LVM_DELETEALLITEMS, 0, 0 );
int nItem = 0;
PROCESSENTRY32 pe32 = { sizeof( PROCESSENTRY32 ) };
HANDLE hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if( hProcessSnap == INVALID_HANDLE_VALUE )
{
return;
}
if( Process32First( hProcessSnap, &pe32 ) )
{
do
{
char szID[56];
wsprintf( szID, "%u", pe32.th32ProcessID );
if( !strcmp( szID, "0" ) )
{
//MessageBox(hWndList, "_DEBUG1", szID, MB_OK);
continue;
}
LVITEM item = {0};
item.iItem = nItem;;
item.mask = LVIF_TEXT;
item.pszText = (LPTSTR)pe32.szExeFile;
::SendMessage( hWndList, LVM_INSERTITEM, 0, (long)&item );
LVITEM lvi;
lvi.iSubItem = 1;
lvi.pszText = (LPTSTR)szID;
::SendMessage( hWndList, LVM_SETITEMTEXT, nItem, (long)&lvi );
nItem++;
}while( Process32Next( hProcessSnap, &pe32 ) );
}
::CloseHandle( hProcessSnap );
}