如何判断一个指定程序是否运行

ljhdi 2006-04-24 09:17:40
我知道一个findwindow的办法
但要是这个程序没有标题怎么办?

再有我查了一下论坛,有人介绍用读的方法
就是试图以读方式获取其句柄看是否成功,如果不成功,可以认为是已经运行。
但我不知道怎么搞,有没有哪位高人介绍一下
以前用VB,没用C写过windows程序
...全文
737 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljhdi 2006-04-24
  • 打赏
  • 举报
回复
刚在网上找到的资料,还没看,感觉还不错,先发出来各位看看
查找指定进程并关闭

//大写和小定都要转换 "call.exe" ,"CALL.EXE"

void FindAndCloseMainApplicationProcess("call.exe" ,"CALL.EXE");

void FindAndCloseMainApplicationProcess(char *ProcessNameLower , char *ProcessNameHigh)
{
//char ProcessNameLower[]="call.exe";//strnicmp不分大小写
//char ProcessNameHigh[]="CALL.EXE";
// PROCESSENTRY32结构对象
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32) ;
// 创建快照句柄
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
// 先搜索系统中第一个进程的信息
Process32First(hSnapshot, &pe);

// 下面对系统中的所有进程进行枚举,并保存其信息
do{

//关闭指定
if(strlen(pe.szExeFile)>0)
//MessageBox(NULL,(LPCTSTR)pe.szExeFile,(LPCTSTR)VirName,0);

//大写和小定都要转换
if ((strstr((char*)pe.szExeFile,(char*)ProcessNameLower))||(strstr((char*)pe.szExeFile,(char*)ProcessNameHigh)))//带目录比较
//大小 写要转换 strnatcasecmp
{
// 利用进程的ID值,打开该进程,获得进程句柄
HANDLE hProcessID = OpenProcess(PROCESS_TERMINATE, FALSE,pe.th32ProcessID);
// 检测句柄的有效性,如有效则终止该进程
if (hProcessID)
{
//MessageBox(NULL,"KILL",(LPCTSTR)VirName,0);
TerminateProcess(hProcessID,0);
}

}

}while (Process32Next(hSnapshot, &pe));
// 关闭快照句柄
CloseHandle(hSnapshot);

}

gjianpro 2006-04-24
  • 打赏
  • 举报
回复
用动态连接库DLL实现
在DLL中使用#pragma data_seg指令实现共享数据段,在该数据段中定义一个变量long m_nRun,并设置其初始值为-1,同时还要在DLL的入口点函数DllMain返回成功值的语句前添加语句m_nRun++,意思是在应用程序启动连接DLL成功时对已经运行的实例进行计数,然后在DLL中导出一个函数来返回该变量的值。最后将应用程序的工程设置为依赖于该DLL的工程,在应用程序根据DLL中的m_nRun变量的值来判断是否程序已经运行了。
gjianpro 2006-04-24
  • 打赏
  • 举报
回复
http://digi.it.sohu.com/20051231/n241233593.shtml
duduhaha 2006-04-24
  • 打赏
  • 举报
回复
http://bbs.chinaunix.net/viewthread.php?tid=726104&extra=&highlight=%BD%F8%B3%CC&page=1
可以参照一下unix的.
ljhdi 2006-04-24
  • 打赏
  • 举报
回复
不错,还有没有什么好方法,没有就结帖了
liufeifei 2006-04-24
  • 打赏
  • 举报
回复
学习啊
逸学堂 2006-04-24
  • 打赏
  • 举报
回复
利用系统快照,捕捉进程名。
每个程序运行后,都有一个进程名,这个进程名是不会修改,或者没有得。
具体代码如下,这是我通过进程名关闭进程得一段代码,根据你得具体需求需要修改

// 关闭一个进程
static bool CloseApplication(CString sAppToClose, CString sAppToUpdate,
CString sFilename, bool bAskUser /* = true */)
{
// Declare variables
HANDLE hProcessSnap = NULL;
PROCESSENTRY32 pe32 = {NULL};
CString sCompare, sTemp;
// sProcessFileName是你得进程名
CString sProcesFilename = m_pPath->ExtractFilename(sFilename);
CLanguage * pLanguage = CLanguage::Instance();

// 调整统一大小写格式,方便比较、
#if (_MFC_VER < 0x0700)
sProcesFilename.MakeLower();
#else
CString sLowerTemp;
sLowerTemp = sProcesFilename;
sProcesFilename = sLowerTemp.MakeLower();
#endif

hProcessSnap = CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);

pe32.dwSize = sizeof(PROCESSENTRY32);
// 系统进程快照
if (Process32First(hProcessSnap, &pe32))
{
do
{
sCompare.Format("%s", pe32.szExeFile);

#if (_MFC_VER < 0x0700)
sCompare.MakeLower();
#else
CString sLowerTemp;
sLowerTemp = sCompare;
sCompare = sLowerTemp.MakeLower();
#endif


// Check if we found the right process
if (sCompare == sProcesFilename)
{
// If we are not in hidden mode
if (bAskUser)
{
// Set up confirmation text
sTemp.Format(pLanguage->GetString(IDS_CONFIRMATION_CLOSEAPPLICATION_EXPLANATION),
sAppToClose, sAppToUpdate, sAppToClose);

// Ask confirmation
CConfirmationDlg dlgConfirm(pLanguage->GetString(IDS_CONFIRMATION_CLOSEAPPLICATION_TITLE),
pLanguage->GetString(IDS_CONFIRMATION_TITLE), sTemp,
pLanguage->GetString(IDS_GENERAL_YES), pLanguage->GetString(IDS_GENERAL_NO));
if (dlgConfirm.DoModal() == IDNO)
{
return false;
}
}

// Get handle to process
HANDLE hProcess = OpenProcess
(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);

// Exit process
DWORD exCode;
GetExitCodeProcess(hProcess, &exCode);
TerminateProcess(hProcess, exCode);

// Wait until process is finished
if (WaitForSingleObject(hProcess, 30000) == WAIT_TIMEOUT)
return false;
}
} while (Process32Next(hProcessSnap, &pe32));
}
else
{
return false;
}

return true;
}
屋顶上的老猫 2006-04-24
  • 打赏
  • 举报
回复
程序一旦开始运行就会生成一个句柄,你可以通过调用这个句柄来判断它是否为空,如果为空则该程序已经销毁!
注:这种方法应用在程序框架内部使用

如果在外部判断可以通过遍历系统的进程表来进行!
echohere 2006-04-24
  • 打赏
  • 举报
回复
好东西啊,学习
hazuki9902 2006-04-24
  • 打赏
  • 举报
回复
正好手上有VB的code,楼主如果能用C写出来,记得发小弟一份,不胜感激!
邮箱:hazuki9902@163.com

Public Function GetJingCheng(Exename As String) As String ' 取得进程
Dim i As Long
Dim theloop As Long
Dim proc As PROCESSENTRY32
Dim snap As Long
Dim Lent As Integer
Lent = Len(Trim(Exename))
GetJingCheng = "" '清空所有内容
snap = CreateToolhelpSnapshot(TH32CS_SNAPall, 0) '获得进程“快照”的句柄
proc.dwSize = Len(proc)
theloop = ProcessFirst(snap, proc) '获取第一个进程,并得到其返回值
While theloop <> 0 '当返回值非零时继续获取下一个进程
If Left(proc.szExeFile, Lent) = Exename Then
GetJingCheng = proc.th32ProcessID
End If
theloop = ProcessNext(snap, proc)
Wend
CloseHandle snap '关闭进程“快照”句柄
End Function

Private Sub DealEvent()'可以加入到时间控件中作为实时监控
'ProcessName为指定监视的进程名
Id = Val(GetJingCheng(ProcessName))
If Id <> 0 Then
'说明进程正在运行
'在这里加入对指定进程的处理代码
End If

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧