一:进程的创建
1 :WIN32API 函数CreateProcess 用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。
BOOL CreateProcess
(
LPCTSTR lpApplicationName , // 指向可执行文件名指针,WINCE 中不可为NULL
LPTSTR lpCommandLine , // 可执行命令字符串指针
LPSECURITY_ATTRIBUTES lpProcessAttributes 。 //WINCE 不支持
LPSECURITY_ATTRIBUTES lpThreadAttributes , //WINCE 不支持
BOOL bInheritHandles , //WINCE 不支持
DWORD dwCreationFlags , // 创建标志
LPVOID lpEnvironment , //WINCE 不支持
LPCTSTR lpCurrentDirectory , //WINCE 不支持
LPSTARTUPINFO lpStartupInfo , //WINCE 不支持
LPPROCESS_INFORMATION lpProcessInformation // 进程信息结构体指针
);
// 函数描述:调用可执行文件
bool CCreateProgressDlg ::WinExec (LPCTSTR FileName )
{
PROCESS_INFORMATION processInfo ; // 进程相关信息
if (!CreateProcess (FileName , NULL , NULL , NULL , NULL , CREATE_NEW_CONSOLE , NULL , NULL , NULL , &processInfo ))
{
return false ;
}
CloseHandle (processInfo .hThread );
CloseHandle (processInfo .hProcess );
return true ;
}
// 调用外部应用程序
void CCreateProgressDlg ::OnBnClickedBtnexec ()
{
WinExec (_T ("iexplore" ));
}
二:进程的管理,需要包含头文件 #include <tlhelp32.h> ,并引入toolhelp .lib
1 :进程列取并管理
// 定义用到的常量
#define TITLE_SIZE 64 // 标题字符串的大小
#define PROCESS_SIZE MAX_PATH // 进程名字符串的大小
#define MAX_TASKS 25 // 最大进程数
// 定义进程信息结构
typedef struct _TASK_LIST {
DWORD dwProcessId ;// 进程标识
DWORD cntThreads ; // 此进程中的线程数
HWND hwnd ; // 进程主窗口句柄
TCHAR ProcessName [PROCESS_SIZE ]; // 进程Exe 文件名
TCHAR WindowTitle [TITLE_SIZE ]; // 主窗口标题名
} TASK_LIST , *PTASK_LIST ;
// 定义进程信息列表结构
typedef struct _TASK_LIST_ENUM {
PTASK_LIST tlist ; // 进程信息列表
DWORD numtasks ; // 进程数
} TASK_LIST_ENUM , *PTASK_LIST_ENUM ;
BOOL Ctest1Dlg ::OnInitDialog ()
{
CDialog ::OnInitDialog ();
// 设置进程列表框标题
CListCtrl * pListCtrl = (CListCtrl *)GetDlgItem (IDC_LISTPROCESS );
CRect rt ;
pListCtrl ->GetClientRect (&rt );
pListCtrl ->InsertColumn (0,_T (" 进程名" ), LVCFMT_LEFT , rt .Width () * 0.35);
pListCtrl ->InsertColumn (1,_T (" 主窗体标题" ), LVCFMT_LEFT , rt .Width () * 0.35);
pListCtrl ->InsertColumn (2, _T (" 线程数" ), LVCFMT_LEFT , rt .Width () * 0.30);
return TRUE ; // return TRUE unless you set the focus to a control
}
//* 函数介绍:刷新按钮单击事件
void Ctest1Dlg ::OnBnClickedBtnrefresh ()
{
TASK_LIST_ENUM processList ; // 进程列表信息
TCHAR numBuf [10]; // 存储进程中的线程数
memset (&g_tlist , 0, sizeof (TASK_LIST ) * MAX_TASKS );
// 得到进程列表信息
DWORD nNumTasks = GetTaskListCE (g_tlist );
processList .numtasks = nNumTasks ;
processList .tlist = g_tlist ;
// 更新进程列表信息,获取主窗口句柄和标题
GetWindowTitles (&processList );
CListCtrl * pListCtrl = (CListCtrl *)GetDlgItem (IDC_LISTPROCESS );
// 清除列表框所有项目
pListCtrl ->DeleteAllItems ();
memset (&numBuf ,0,sizeof (numBuf ));
// 向列表框中添加进程相关信息
for (int i =0;i <processList .numtasks ;i ++)
{
// 进程exe 名,标题名,线程数
pListCtrl ->InsertItem (i ,_T ("Test" ));
pListCtrl ->SetItemText (i ,0,processList .tlist [i ].ProcessName );
pListCtrl ->SetItemText (i ,1,processList .tlist [i ].WindowTitle );
_itow (processList .tlist [i ].cntThreads ,numBuf ,10);
pListCtrl ->SetItemText (i ,2,numBuf );
}
}
// 函数介绍:激活进程按钮单击事件
void Ctest1Dlg ::OnBnClickedBtnactive ()
{
CListCtrl * pListCtrl = (CListCtrl *)GetDlgItem (IDC_LISTPROCESS );
POSITION pos = pListCtrl ->GetFirstSelectedItemPosition ();
if (pos )
{
int nItemIndex = pListCtrl ->GetNextSelectedItem (pos );
// 激活进程
ActivateProcess (&g_tlist [nItemIndex ]);
}
}
// 函数介绍:终止进程按钮单击事件
void Ctest1Dlg ::OnBnClickedBtnterminate ()
{
CListCtrl * pListCtrl = (CListCtrl *)GetDlgItem (IDC_LISTPROCESS );
POSITION pos = pListCtrl ->GetFirstSelectedItemPosition ();
if (pos )
{
int nItemIndex = pListCtrl ->GetNextSelectedItem (pos );
// 终止进程
KillProcess (&g_tlist [nItemIndex ]);
}
// 刷新进程列表
SendMessage (WM_COMMAND , (WPARAM )IDC_BTNREFRESH , 0);
}
// 函数介绍:得到CE 系统中运行的任务列表
// 出口参数:pList :存储得到任务列表信息
// 返回值:返回得到的任务数
DWORD Ctest1Dlg ::GetTaskListCE ( PTASK_LIST pList ) {
HINSTANCE hKernel = NULL ;
HINSTANCE hProcessSnap = NULL ;
PROCESSENTRY32 pe32 = {0};
DWORD dwTaskCount = 0;
// 状态toolhelp.dll 动态连接库
hKernel = LoadLibrary (_T ("toolhelp.dll" ));
if (!hKernel )
{
::MessageBox (NULL , L "Toolhelp.dll 加载失败" , L " 进程列举" , MB_OK );
return 0;
}
// 创建进程映射
hProcessSnap = (HINSTANCE )CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS , 0);
// 如果失败,就退出
if (hProcessSnap == (HANDLE )-1)
return 0;
dwTaskCount = 0;
// 设置保存进程相关内容的变量的结构大小
pe32 .dwSize = sizeof (PROCESSENTRY32 );
// 获取第一个进程,并将此进程信息写入进程结构的变量pe32 中
if (Process32First (hProcessSnap , &pe32 ))
{
do
{
LPTSTR pCurChar ;
if (_tcsstr (pe32 .szExeFile , L "//" ))
pCurChar = _tcsrchr (pe32 .szExeFile , '//' );
else
pCurChar = pe32 .szExeFile ;
lstrcpy (pList -> ProcessName , pCurChar );
pList ->dwProcessId = pe32 .th32ProcessID ;
pList ->cntThreads = pe32 .cntThreads ;
++dwTaskCount ; // 进程数目加
++pList ; // 移到下一个结构内存块
}
while (Process32Next (hProcessSnap , &pe32 )); // 移至下一个进程
}
else
dwTaskCount = 0; //
CloseHandle (hProcessSnap );
return dwTaskCount ;
}
// 函数介绍:得到任务的主窗体标题和句柄
// 入口参数:te :进程信息列表指针
// 出口参数:te :进程信息列表指针
void Ctest1Dlg ::GetWindowTitles ( PTASK_LIST_ENUM te ) {
// enumerate all windows
EnumWindows ((WNDENUMPROC ) EnumWindowsProc , (LPARAM ) te );
}
// 函数介绍:回调函数,被EnumWindows 调用
// 入口参数:hwnd :窗体句柄
// lParam : 进程信息列表指针
// 出口参数:lParam :进程信息列表指针
BOOL CALLBACK Ctest1Dlg ::EnumWindowsProc ( HWND hwnd , DWORD lParam ) {
DWORD pid = 0;
DWORD i ;
TCHAR buf [TITLE_SIZE ];
PTASK_LIST_ENUM te = (PTASK_LIST_ENUM )lParam ;
PTASK_LIST tlist = te ->tlist ;
DWORD numTasks = te ->numtasks ;
// 根据窗口句柄,得到进程标识
if (!GetWindowThreadProcessId ( hwnd , &pid ))
{
return TRUE ;
}
// 查找进程标识和列表中相同的进程标识
for (i =0; i <numTasks ; i ++)
{
if (tlist [i ].dwProcessId == pid )
{
if (::IsWindowVisible (hwnd ))
{
tlist [i ].hwnd = hwnd ;
int nCnt = ::GetWindowText ( hwnd , buf , TITLE_SIZE );
buf [nCnt ] = '/0' ;
if (nCnt )
{
lstrcpy ( tlist [i ].WindowTitle , buf );
}
}
break ;
}
}
// 继续列举窗体
return TRUE ;
}
// 函数介绍:激活进程方法
// 入口参数:tlist :进程信息
// 出口参数:( 无)
// 返回值: True :成功;False :失败
bool Ctest1Dlg ::ActivateProcess (PTASK_LIST tlist )
{
// 判断是否存在主窗口,如存在就激活它
if (tlist ->hwnd && tlist ->WindowTitle )
{
::SetForegroundWindow (tlist ->hwnd );
::SetActiveWindow (tlist ->hwnd );
return TRUE ;
}
else
{
return FALSE ;
}
}
// 函数介绍:终止进程方法
// 入口参数:tlist :进程信息
// 出口参数:( 无)
bool Ctest1Dlg ::KillProcess ( PTASK_LIST tlist )
{
HANDLE hProcess ;
// 如果没有主窗体, 则用TerminateProcess 终止进程
if (!tlist ->hwnd )
{
// 根据进程标识,返回进程句柄
hProcess = OpenProcess ( PROCESS_ALL_ACCESS , FALSE , tlist ->dwProcessId );
// 成功的话,终止进程
if (hProcess )
{
if (!TerminateProcess ( hProcess , 1 ))
{
CloseHandle ( hProcess );
return FALSE ;
}
CloseHandle ( hProcess );
return TRUE ;
}
else
{
return FALSE ;
}
}
// 有主窗体,发送主窗口关闭消息,终止线程
else
{
::PostMessage ( tlist ->hwnd , WM_CLOSE , 0, 0 );
return TRUE ;
}
}