中易网

C++通过进程名获得进程PID

答案:3  悬赏:80  
解决时间 2021-03-02 17:27
有什么Windows API可以通过进程名获得进程PID,把代码贴上来吧,谢谢
最佳答案
用进程快照是可以的,以下代码你自己看着选你所需
void CLoaderDlg::UpdateProcessList()
{
UpdateData(TRUE);
m_ProcList.DeleteAllItems();

MYHOOKSTRUCT ProcHookArry[20];
memset(ProcHookArry,0,20*sizeof(MYHOOKSTRUCT));
int nCount = 0;
CString str="";
//Second=1;

PROCESSENTRY32 pe32;//进程信息结构体
pe32.dwSize = sizeof(pe32);//必须先填充大小。
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
MessageBox("CreateToolhelp32Snapshot调用失败","Warning");
return;
}
BOOL bMore = ::Process32First(hProcessSnap,&pe32);
while(bMore)
{
//注意:当列表框控件中选中了排序(sort)时会出现ID与程序名不一致。
if(strcmp(strupr(pe32.szExeFile),"NOTEPAD.EXE")==0)
{
ProcHookArry[nCount].ProcessID=pe32.th32ProcessID;
ProcHookArry[nCount].ThreadID=GetThreadId(pe32.th32ProcessID);
ProcHookArry[nCount].hWnd=myGetWindowByProcessId(pe32.th32ProcessID);
strcpy(ProcHookArry[nCount].Name,pe32.szExeFile);
ProcHookArry[nCount].hHook=0;
ProcHookArry[nCount].HookFlag=0;
nCount++;
}

bMore = ::Process32Next(hProcessSnap,&pe32);

}
::CloseHandle(hProcessSnap);
for(int i=0;i<nCount;i++)
{
for(int j=0;j<m_HookArryLen;j++)
{
if(ProcHookArry[i].ThreadID==m_ProcHookArry[j].ThreadID)
{
ProcHookArry[i].hHook=m_ProcHookArry[j].hHook;
ProcHookArry[i].hWnd=m_ProcHookArry[j].hWnd;
ProcHookArry[i].ProcessID=m_ProcHookArry[j].ProcessID;
ProcHookArry[i].HookFlag=m_ProcHookArry[j].HookFlag;
strcpy(ProcHookArry[i].Name,m_ProcHookArry[j].Name);
break;
}
}
}
memcpy(m_ProcHookArry,ProcHookArry,nCount*sizeof(MYHOOKSTRUCT));
m_HookArryLen=nCount;
int index=0;
for(int n=0;n<m_HookArryLen;n++)
{
str.Format("%d",m_ProcHookArry[n].ThreadID);
index=m_ProcList.GetItemCount();
m_ProcList.InsertItem(index,str);
m_ProcList.SetItemText(index,1,m_ProcHookArry[n].Name);
if(m_ProcHookArry[n].HookFlag)
{
str="已加载";
m_ProcList.SetItemText(index,2,str);
}
else
{
str="未加载";
m_ProcList.SetItemText(index,2,str);
}
char buf[100]={0};
::GetWindowText(m_ProcHookArry[n].hWnd,buf,100);
str=buf;
m_ProcList.SetItemText(index,3,str);
//::SendMessage(m_ProcHookArry[n].hWnd,WM_CLOSE,0,0);
}

UpdateData(FALSE);
}
全部回答
CreateToolhelp32Snapshot()函数用来获得某一时刻系统的进程、堆(heap)、模块(module)或线程的快照信息; TerminateProcess()函数用来停止某个正在运行的进程。 函数各参数具体含义,参见msdn
handle   hsnapshot=createtoolhelp32snapshot(th32cs_snapprocess,0   ); processentry32   procentry=sizeof(processentry32); bool   bflag=process32first(   hsnapshot,   &procentry   )   ; while(   bflag   ) {             if(stricmp(procentry.szexefile, "你的程序名 ")==0)                     processid=procentry.th32processid;         //找到             bflag=process32next(hsnapshot,&procentry); } 注意一个程序可能有几个实例同时运行,所以可能同时找到几个id。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
哪位有正版的金昌ex9000软件,要正版的
问:黄山到桂林火车怎样换乘
用什么工具能检测系统是否稳定?或者运行正常
电力图上D1ALE-E4是什么意思?
人工作是为什么
周大福巩义星月广场店地址有知道的么?有点事
想知道: 绵阳市 愿意山看守所 在哪
青城巷/北京南路(路口)地址在什么地方,想过
湖南省工业设备安装有限公司和中核韶关锦原铀
羊绒外套洗小了怎么扩
Fe(OH)3+H2SO4==Fe2(SO4)3+H2O 怎么配平?
江都市樊川镇,到扬州市区,怎么坐车?
借条没有,只有银行流水,可以算借款吗
铝塑管的原材料是什么
国家电网莱州市供电公司职工活动中心在哪里啊
推荐资讯
《九国夜雪》的书签一共有几款(从《寻梦人》
请问企业必须根据规定的会计科目开设帐户是对
想成为正式护士考试的时候都考什么
重庆市工伤鉴定机构在哪
天成房产NO.110怎么去啊,有知道地址的么
请问江宁武夷绿洲的初中学区是哪个学校?谢谢
请问,我和房东签的租房合同,昨天签的合同,但
小酌园在什么地方啊,我要过去处理事情
琦瑞德泽在什么地方啊,我要过去处理事情
Windows 7如何能音响和耳机同时播放?共享USB
周口一高分数线 2016年是多少
我想知道"纵一苇之所如,凌万顷之茫然"的文言
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?