C++通过进程名获得进程PID
答案:3 悬赏:80
解决时间 2021-03-02 17:27
- 提问者网友:写不出迷人情诗
- 2021-03-02 10:18
有什么Windows API可以通过进程名获得进程PID,把代码贴上来吧,谢谢
最佳答案
- 二级知识专家网友:蜜罐小熊
- 2021-03-02 11:06
用进程快照是可以的,以下代码你自己看着选你所需
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);
}
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);
}
全部回答
- 1楼网友:高冷不撩人
- 2021-03-02 13:11
CreateToolhelp32Snapshot()函数用来获得某一时刻系统的进程、堆(heap)、模块(module)或线程的快照信息;
TerminateProcess()函数用来停止某个正在运行的进程。
函数各参数具体含义,参见msdn
- 2楼网友:单身小柠`猫♡
- 2021-03-02 12:38
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。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
• 手机登qq时,显示手机磁盘不足,清理后重新登 |
• 刺客的套装怎么选啊? |