LPCTSTR s_AppName = _T("ABCDEFG");//欲查找的线程ID.(SetProp函数指定的项)
UINT s_AppMagic = 1024;
//防止重复打开窗口
HANDLE handSemp = CreateSemaphore(NULL , 0 , 1 , s_AppName);//创建基于指定名字的信号量
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
HWND hwndPre = ::GetWindow(::GetDesktopWindow(), GW_CHILD);/*如果指定窗口是父窗口,则获得的是在Z序顶端的子窗口的句柄,否则为NULL。*/
while(::IsWindow(hwndPre))
{
if (::GetProp(hwndPre, s_AppName) == (HANDLE)s_AppMagic)/*如果属性表中包含了给定的字符串,那么返回值为相关的数据句柄。否则,返回值为NULL。 */
{
//此处即已在系统中找到了指定线程
if (::IsIconic(hwndPre)) //确定给定窗口是否是最小化(图标化)的窗口
{
::ShowWindow(hwndPre, SW_RESTORE);/*激活并显示窗口。SW_RESTORE:如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。 */
}
::SetForegroundWindow(hwndPre);/*将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。*/
}
hwndPre = GetWindow(hwndPre, GW_HWNDNEXT);
}
}
检查某进程是否存在:
PROCESSENTRY32 *info = new PROCESSENTRY32;
// 在使用这个结构之前,先设置它的大小
info->dwSize = sizeof(PROCESSENTRY32 );
CString proName = {"devenv.exe"};
HANDLE handlePro = NULL; //结束进程句柄
// 给系统内的所有进程拍一个快照
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
printf(" CreateToolhelp32Snapshot调用失败! /n");
return -1;
}
// 遍历进程快照,轮流显示每个进程的信息
BOOL bMore = ::Process32First(hProcessSnap, info);
BOOL terminate = FALSE;
while( bMore != FALSE)
{
if(proName.CompareNoCase(info->szExeFile) == 0)
{
handlePro=OpenProcess(PROCESS_TERMINATE, FALSE, info->th32ProcessID);
if (NULL == handlePro)
{
break;
}
//结束进程
terminate = TerminateProcess(handlePro, 0);
}
bMore = Process32Next(hProcessSnap, info);
}
::CloseHandle(hProcessSnap); //关闭该进程
return 1;