判斷指定的進(jìn)程或程序是否存在方法小結(jié)(vc等)
更新時(shí)間:2013年01月12日 16:51:57 作者:
VC判斷進(jìn)程是否存在?比如我想知道記事本是否運(yùn)行,要用到哪些函數(shù)等實(shí)例,需要的朋友可以參考下
一、判斷指定程序名的進(jìn)程是否存在
BOOL EnumWindows( WNDENUMPROC lpEnumFunc, // pointer to callback function LPARAM lParam // application-defined value);
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.
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;
}
二、判斷指定進(jìn)程名的進(jìn)程是否存在
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判斷程序調(diào)用的外部進(jìn)程是否結(jié)束
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判斷進(jìn)程是否存在?比如我想知道記事本是否運(yùn)行,要用到哪些函數(shù)?
enProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,aProcesses[i]);
// 取得特定PID的進(jìn)程名
if (hProcess )
{
if ( EnumProcessModules(hProcess,&hMod,sizeof(hMod), &cbNeeded))
{
GetModuleBaseName( hProcess, hMod,szProcessName,sizeof(szProcessName));
//將取得的進(jìn)程名與輸入的進(jìn)程名比較,如相同則返回進(jìn)程PID
if(!stricmp(szProcessName, InputProcessName))
{
CloseHandle(hProcess);
return aProcesses[i];
}
}
}//end of if (hProcess)
}//end of for
//沒有找到相應(yīng)的進(jìn)程名,返回0
CloseHandle(hProcess);
return 0;
}
也可以枚舉得到所有進(jìn)程的應(yīng)用程序名,然后和知道應(yīng)用程序名比較判斷。
五、實(shí)現(xiàn)程序只運(yùn)行一次的方法
實(shí)現(xiàn)程序只運(yùn)行一次的方法很多,但是原理都是一樣的,就是運(yùn)行第一次的時(shí)候設(shè)置一個(gè)標(biāo)記,每次運(yùn)行的時(shí)候檢查該標(biāo)記,如果有就說明已經(jīng)運(yùn)行了。
具體實(shí)現(xiàn):
1、在程序初始化的時(shí)候 (InitInstance()) 枚舉所有的窗口,查找本程序的實(shí)例是否存在
2、在主窗口初始化的時(shí)候在本窗口的屬性列表中添加一個(gè)標(biāo)記,以便程序查找.
部分關(guān)鍵代碼 :
1、在App的InitInstance()中枚舉所有窗口,查找本程序?qū)嵗?
HWND oldHWnd = NULL;
EnumWindows(EnumWndProc,(LPARAM)&oldHWnd); //枚舉所有運(yùn)行的窗口
if(oldHWnd != NULL)
{
AfxMessageBox( "本程序已經(jīng)在運(yùn)行了 ");
::ShowWindow(oldHWnd,SW_SHOWNORMAL); //激活找到的前一個(gè)程序
::SetForegroundWindow(oldHWnd); //把它設(shè)為前景窗口
return false; //退出本次運(yùn)行
}
2、添加EnumWndProc窗口過程函數(shù)://添加的標(biāo)識(shí)只運(yùn)行一次的屬性名
CString g_szPropName = "Your Prop Name "; //自己定義一個(gè)屬性名
HANDLE g_hValue = (HANDLE)1; //自己定義一個(gè)屬性值
BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
{
HANDLE h = GetProp(hwnd,g_szPropName);
if( h == g_hValue)
{
*(HWND*)lParam = hwnd;
return false;
}
return true;
}
3、在主窗口的 OnInitDialog()中添加屬性 //設(shè)置窗口屬性
SetProp(m_hWnd,g_szPropName,g_hValue);
再次啟動(dòng)時(shí),先檢查當(dāng)前存在的所有窗口,如果有標(biāo)題相同的,則把先前運(yùn)行的窗口當(dāng)成當(dāng)前窗口
我的程序如下:
HWND hWnd_Exist;
hWnd_Exist=::GetDesktopWindow();
hWnd_Exist=::GetWindow(hWnd_Exist,GW_CHILD);
for(;;)
{
if(hWnd_Exist==NULL)
{
break;
}
char s[256];
memset(s,0,256);
::SendMessage(hWnd_Exist,WM_GETTEXT,255,(LONG)s);
if(strstr(s, "****** ")!=NULL)
break;
hWnd_Exist=::GetWindow(hWnd_Exist,GW_HWNDNEXT);
}
if(hWnd_Exist != NULL)
{
::ShowWindow(hWnd_Exist,SW_SHOWNORMAL);
::SetForegroundWindow(hWnd_Exist);
exit(0);
}
聲明一個(gè)全局 CMutex 變量:
--------------------------------------------------------------------------------
CMutex mutexApp(FALSE, _T( "VPOS2000Server ")); //用此互斥量阻止多個(gè)實(shí)例
在你的 CWinApp 類的重載函數(shù): InitInstance 中加入如下代碼:
if (!mutexApp.Lock(1))
return FALSE;
::CreateMutex(NULL, TRUE, m_pszExeName);
if(ERROR_ALREADY_EXISTS == GetLastError())
{
CWnd* pPrevHwnd = CWnd::GetDesktopWindow()-> GetWindow(GW_CHILD);
while(pPrevHwnd)
{
if(::GetProp(pPrevHwnd-> GetSafeHwnd(), m_pszExeName))
{
if(pPrevHwnd-> IsIconic())
{
pPrevHwnd-> ShowWindow(SW_RESTORE);
}
pPrevHwnd-> SetForegroundWindow();
pPrevHwnd-> GetLastActivePopup()-> SetForegroundWindow();
return FALSE;
}
pPrevHwnd = pPrevHwnd-> GetWindow(GW_HWNDNEXT);
}
TRACE( "Could not fond frevious instance main window ! ");
return FALSE;
}
創(chuàng)建一個(gè)全局的互斥量,每次啟動(dòng)時(shí)檢查是否存在。
BOOL CRTDBApp::OnlyOneInstance()
{
if(::CreateMutex(NULL, TRUE, "onlyone ") == NULL )
{
TRACE0( "CreateMutex error. ");
return FALSE;
};
if( ::GetLastError() == ERROR_ALREADY_EXISTS) {
CWnd* pPrevWnd = CWnd::FindWindow(NULL, "onlyonehwnd ");
if(pPrevWnd)
{
if( pPrevWnd-> IsIconic())
pPrevWnd-> ShowWindow(SW_RESTORE);
pPrevWnd-> SetForegroundWindow();
pPrevWnd-> GetLastActivePopup()-> SetForegroundWindow();
return FALSE;
}
};
return TRUE;
}
BOOL EnumWindows( WNDENUMPROC lpEnumFunc, // pointer to callback function LPARAM lParam // application-defined value);
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.
復(fù)制代碼 代碼如下:
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;
}
二、判斷指定進(jìn)程名的進(jìn)程是否存在
復(fù)制代碼 代碼如下:
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判斷程序調(diào)用的外部進(jìn)程是否結(jié)束
復(fù)制代碼 代碼如下:
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判斷進(jìn)程是否存在?比如我想知道記事本是否運(yùn)行,要用到哪些函數(shù)?
復(fù)制代碼 代碼如下:
enProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE,aProcesses[i]);
// 取得特定PID的進(jìn)程名
if (hProcess )
{
if ( EnumProcessModules(hProcess,&hMod,sizeof(hMod), &cbNeeded))
{
GetModuleBaseName( hProcess, hMod,szProcessName,sizeof(szProcessName));
//將取得的進(jìn)程名與輸入的進(jìn)程名比較,如相同則返回進(jìn)程PID
if(!stricmp(szProcessName, InputProcessName))
{
CloseHandle(hProcess);
return aProcesses[i];
}
}
}//end of if (hProcess)
}//end of for
//沒有找到相應(yīng)的進(jìn)程名,返回0
CloseHandle(hProcess);
return 0;
}
也可以枚舉得到所有進(jìn)程的應(yīng)用程序名,然后和知道應(yīng)用程序名比較判斷。
五、實(shí)現(xiàn)程序只運(yùn)行一次的方法
實(shí)現(xiàn)程序只運(yùn)行一次的方法很多,但是原理都是一樣的,就是運(yùn)行第一次的時(shí)候設(shè)置一個(gè)標(biāo)記,每次運(yùn)行的時(shí)候檢查該標(biāo)記,如果有就說明已經(jīng)運(yùn)行了。
具體實(shí)現(xiàn):
1、在程序初始化的時(shí)候 (InitInstance()) 枚舉所有的窗口,查找本程序的實(shí)例是否存在
2、在主窗口初始化的時(shí)候在本窗口的屬性列表中添加一個(gè)標(biāo)記,以便程序查找.
部分關(guān)鍵代碼 :
1、在App的InitInstance()中枚舉所有窗口,查找本程序?qū)嵗?
復(fù)制代碼 代碼如下:
HWND oldHWnd = NULL;
EnumWindows(EnumWndProc,(LPARAM)&oldHWnd); //枚舉所有運(yùn)行的窗口
if(oldHWnd != NULL)
{
AfxMessageBox( "本程序已經(jīng)在運(yùn)行了 ");
::ShowWindow(oldHWnd,SW_SHOWNORMAL); //激活找到的前一個(gè)程序
::SetForegroundWindow(oldHWnd); //把它設(shè)為前景窗口
return false; //退出本次運(yùn)行
}
2、添加EnumWndProc窗口過程函數(shù)://添加的標(biāo)識(shí)只運(yùn)行一次的屬性名
復(fù)制代碼 代碼如下:
CString g_szPropName = "Your Prop Name "; //自己定義一個(gè)屬性名
HANDLE g_hValue = (HANDLE)1; //自己定義一個(gè)屬性值
BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
{
HANDLE h = GetProp(hwnd,g_szPropName);
if( h == g_hValue)
{
*(HWND*)lParam = hwnd;
return false;
}
return true;
}
3、在主窗口的 OnInitDialog()中添加屬性 //設(shè)置窗口屬性
SetProp(m_hWnd,g_szPropName,g_hValue);
再次啟動(dòng)時(shí),先檢查當(dāng)前存在的所有窗口,如果有標(biāo)題相同的,則把先前運(yùn)行的窗口當(dāng)成當(dāng)前窗口
我的程序如下:
復(fù)制代碼 代碼如下:
HWND hWnd_Exist;
hWnd_Exist=::GetDesktopWindow();
hWnd_Exist=::GetWindow(hWnd_Exist,GW_CHILD);
for(;;)
{
if(hWnd_Exist==NULL)
{
break;
}
char s[256];
memset(s,0,256);
::SendMessage(hWnd_Exist,WM_GETTEXT,255,(LONG)s);
if(strstr(s, "****** ")!=NULL)
break;
hWnd_Exist=::GetWindow(hWnd_Exist,GW_HWNDNEXT);
}
if(hWnd_Exist != NULL)
{
::ShowWindow(hWnd_Exist,SW_SHOWNORMAL);
::SetForegroundWindow(hWnd_Exist);
exit(0);
}
聲明一個(gè)全局 CMutex 變量:
--------------------------------------------------------------------------------
CMutex mutexApp(FALSE, _T( "VPOS2000Server ")); //用此互斥量阻止多個(gè)實(shí)例
在你的 CWinApp 類的重載函數(shù): InitInstance 中加入如下代碼:
復(fù)制代碼 代碼如下:
if (!mutexApp.Lock(1))
return FALSE;
::CreateMutex(NULL, TRUE, m_pszExeName);
if(ERROR_ALREADY_EXISTS == GetLastError())
{
CWnd* pPrevHwnd = CWnd::GetDesktopWindow()-> GetWindow(GW_CHILD);
while(pPrevHwnd)
{
if(::GetProp(pPrevHwnd-> GetSafeHwnd(), m_pszExeName))
{
if(pPrevHwnd-> IsIconic())
{
pPrevHwnd-> ShowWindow(SW_RESTORE);
}
pPrevHwnd-> SetForegroundWindow();
pPrevHwnd-> GetLastActivePopup()-> SetForegroundWindow();
return FALSE;
}
pPrevHwnd = pPrevHwnd-> GetWindow(GW_HWNDNEXT);
}
TRACE( "Could not fond frevious instance main window ! ");
return FALSE;
}
創(chuàng)建一個(gè)全局的互斥量,每次啟動(dòng)時(shí)檢查是否存在。
復(fù)制代碼 代碼如下:
BOOL CRTDBApp::OnlyOneInstance()
{
if(::CreateMutex(NULL, TRUE, "onlyone ") == NULL )
{
TRACE0( "CreateMutex error. ");
return FALSE;
};
if( ::GetLastError() == ERROR_ALREADY_EXISTS) {
CWnd* pPrevWnd = CWnd::FindWindow(NULL, "onlyonehwnd ");
if(pPrevWnd)
{
if( pPrevWnd-> IsIconic())
pPrevWnd-> ShowWindow(SW_RESTORE);
pPrevWnd-> SetForegroundWindow();
pPrevWnd-> GetLastActivePopup()-> SetForegroundWindow();
return FALSE;
}
};
return TRUE;
}
相關(guān)文章
C++中main函數(shù)怎樣調(diào)用類內(nèi)函數(shù)
這篇文章主要介紹了C++中main函數(shù)怎樣調(diào)用類內(nèi)函數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08與ASCII碼相關(guān)的C語言字符串操作函數(shù)
這篇文章主要介紹了與ASCII碼相關(guān)的C語言字符串操作函數(shù),分別是將字符轉(zhuǎn)換為ASCII碼的toascii()函數(shù)和根據(jù)ASCII碼進(jìn)行字符串比較的strcoll()函數(shù),需要的朋友可以參考下2015-08-08C語言中if語句加大括號(hào)和不加大括號(hào)的區(qū)別介紹
這篇文章主要給大家介紹了關(guān)于C語言中if語句加大括號(hào)和不加大括號(hào)的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12