判断指定的进程或程序是否存在方法
2013年01月27日
⁄ 综合
⁄ 共 3276字 ⁄ 字号
小 中 大
-
判断指定的进程或程序是否存在方法
-
分类: Windows program 2011-06-27 15:14 112人阅读 评论(0) 收藏 举报
-
-
一、判断指定程序名的进程是否存在
-
-
BOOL EnumWindows( WNDENUMPROC lpEnumFunc,
-
-
The EnumWindows function enumerates all top-level windows on the screen by passing the handle to each window, in turn, to an application-defined callback function. EnumWindows continues until the last top-level window is enumerated or the callback function returns FALSE.
-
-
view plain
-
-
BOOL CALLBACK IpEnumFunc(HWND hwnd,LPARAM lParam)
-
{
-
char wndName[100];
-
::GetWindowText(hwnd,wndName,sizeof(wndName));
-
if(wndName!="")
-
{
-
if(strcmp(wndName,name1)==0)
-
{
-
WndHnd=hwnd;
-
flag=1;
-
-
}
-
}
-
return 1;
-
}
-
-
-
-
二、判断指定进程名的进程是否存在
-
-
-
-
view plain
-
-
DWORD GetProcessidFromName(LPCTSTR name)
-
{
-
PROCESSENTRY32 pe;
-
DWORD id=0;
-
HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
-
pe.dwSize=sizeof(PROCESSENTRY32);
-
if(!Process32First(hSnapshot,&pe))
-
return 0;
-
while(1)
-
{
-
pe.dwSize=sizeof(PROCESSENTRY32);
-
if(Process32Next(hSnapshot,&pe)==FALSE)
-
break;
-
if(strcmp(pe.szExeFile,name)==0)
-
{
-
id=pe.th32ProcessID;
-
-
break;
-
}
-
-
-
}
-
CloseHandle(hSnapshot);
-
return id;
-
}
-
-
如果返回值不为零,则存在,否则不存在。
-
-
-
-
三、VC判断程序调用的外部进程是否结束
-
-
-
-
view plain
-
-
PROCESS_INFORMATION pi;
-
STARTUPINFO si;
-
memset(&si,0,sizeof(si));
-
si.cb=sizeof(si);
-
si.wShowWindow=SW_HIDE;
-
si.dwFlags=STARTF_USESHOWWINDOW;
-
bool fRet=CreateProcess(NULL,str.GetBuffer(str.GetLength()),NULL,FALSE,NULL,NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW,NULL,NULL,&si,&pi);
-
-
-
-
DWORD ExitCode;
-
-
ExitCode=STILL_ACTIVE;
-
while(ExitCode==STILL_ACTIVE)
-
{
-
GetExitCodeProcess(pi.hProcess,&ExitCode);
-
}
-
-
四、VC判断进程是否存在?比如我想知道记事本是否运行,要用到哪些函数?
-
-
view plain
-
-
enProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,aProcesses[i]);
-
-
if (hProcess )
-
{
-
if ( EnumProcessModules(hProcess,&hMod,sizeof(hMod), &cbNeeded))
-
{
-
GetModuleBaseName( hProcess, hMod,szProcessName,sizeof(szProcessName));
-
-
if(!stricmp(szProcessName, InputProcessName))
-
{
-
CloseHandle(hProcess);
-
return aProcesses[i];
-
}
-
}
-
}
-
}
-
-
CloseHandle(hProcess);
-
return 0;
-
}
-
-
也可以枚举得到所有进程的应用程序名,然后和知道应用程序名比较判断。
-
-
-
-
五、实现程序只运行一次的方法
-
-
实现程序只运行一次的方法很多,但是原理都是一样的,就是运行第一次的时候设置一个标记,每次运行的时候检查该标记,如果有就说明已经运行了。
-
-
具体实现:
-
-
1、在程序初始化的时候 (InitInstance()) 枚举所有的窗口,查找本程序的实例是否存在
-
2、在主窗口初始化的时候在本窗口的属性列表中添加一个标记,以便程序查找.
-
-
-
部分关键代码 :
-
-
1、在App的InitInstance()中枚举所有窗口,查找本程序实例
-