您的位置:首页 > 其它

在系统中检测指定的窗口是否已经打开,检查某进程是否存在

2011-04-22 15:23 281 查看
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: