请问各位如何得到一个进程的ID? 举个例子:运行windows自带的计算器,要得到它的进程ID,我用的方法是先FindWindow(NULL, "计算器")得到窗口句柄,然后再用GetWindowThreadProcessId这个函数即可。但这个方法并不是太好,我认为应该还有其他方法。所以请各位指教,是否能通过上述计算器的进程名(calc.exe)来获得它的进程ID?拜托各位,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 static HANDLE hsnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS , 0 ); static DWORD PID ; static int Memlen ; static PWSTR pszLibBaseAddr = NULL ; static char CurPath[256] ; static WCHAR wCurPath[256] ; int errcode ; HINSTANCE hInstance ; mydll remotedll ; PROCESSENTRY32 *PE32 = new PROCESSENTRY32 ; PE32->dwSize = sizeof( PROCESSENTRY32 ) ; bool find = false; if ( Process32First( hsnapShot , PE32 )) { if ( GetLastError() == ERROR_NO_MORE_FILES ) return false ; while (Process32Next( hsnapShot , PE32 ) ) { if ( strcmp( PE32->szExeFile , "notepad.exe" ) == 0 ) { PID = PE32->th32ProcessID ; find = true ; break; } } } if ( find == false ) { MessageBox( hWnd , "No this notepad.exe process" ,"Error",0); return false; } 解释:1先建立一个进程的快照 static HANDLE hsnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS , 0 ) 并返回快照句柄2初始化PROCESSENTRY32且成员dwSize的值必须为该结构的大小PROCESSENTRY32 *PE32 = new PROCESSENTRY32 ;PE32->dwSize = sizeof( PROCESSENTRY32 ) ;3Process32First( hsnapShot , PE32 )获得系统中的第一个进程信息并保存在PE32中4Process32Next( hsnapShot , PE32 )遍历进程5strcmp( PE32->szExeFile , "notepad.exe" )和你要找的进程名比较6 Over 使用 EnumProcess 函数BOOL EnumProcesses( DWORD *lpidProcess, // array of process identifiers DWORD cb, // size of array DWORD *cbNeeded // number of bytes returned);直接返回当前所有的进程ID,遍历就可以得到notepad的ID了。 问题解决了?用快照还是EnumProcesses的?要再给分,可以另外开送分贴,在贴子里面说明这个贴子的地址 :) 我做了些改进,另外strcmp会区分大小写字母,所以要换成_stricmp即可。DWORD CTmpDlg::GetProcessID(LPCTSTR FullProcessName){ DWORD PID; PROCESSENTRY32 pe32 = {0}; HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapShot != (HANDLE) -1) { pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hSnapShot, &pe32)) { while (Process32Next(hSnapShot, &pe32)) { if (_stricmp(pe32.szExeFile, FullProcessName) == 0) { PID = pe32.th32ProcessID; break; } } } } CloseHandle(hSnapShot); return PID;} 如何在已自定义背景图的多文档中上添加自己的图案控件啊? VC解密函数 急!求教:CDMA2000的数据包详细格式! 我制作自绘菜单为什么窗口上的菜单要点击一次才变成自绘的样子? 又发现一个MATLAB写的人脸检测系统源代码,需要的进 多线程变量如何加保护? STL问题当场结帐 哪里有介绍NAT(网络地址转换)原理的网站? 请问MICROSOFT EMBEDDED VISUAL C++ 4.0的序列号是多少 转化成tiff VC7如何使用ActiveX向导生成项目? 请问在Windows中获取文件属性的API函数是什么?
static DWORD PID ;
static int Memlen ;
static PWSTR pszLibBaseAddr = NULL ;
static char CurPath[256] ;
static WCHAR wCurPath[256] ;
int errcode ;
HINSTANCE hInstance ;
mydll remotedll ;
PROCESSENTRY32 *PE32 = new PROCESSENTRY32 ;
PE32->dwSize = sizeof( PROCESSENTRY32 ) ;
bool find = false; if ( Process32First( hsnapShot , PE32 ))
{
if ( GetLastError() == ERROR_NO_MORE_FILES )
return false ;
while (Process32Next( hsnapShot , PE32 ) )
{
if ( strcmp( PE32->szExeFile , "notepad.exe" ) == 0 )
{
PID = PE32->th32ProcessID ;
find = true ;
break;
}
}
}
if ( find == false )
{
MessageBox( hWnd , "No this notepad.exe process" ,"Error",0);
return false;
}
1先建立一个进程的快照 static HANDLE hsnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS , 0 ) 并返回快照句柄
2初始化PROCESSENTRY32且成员dwSize的值必须为该结构的大小
PROCESSENTRY32 *PE32 = new PROCESSENTRY32 ;
PE32->dwSize = sizeof( PROCESSENTRY32 ) ;
3Process32First( hsnapShot , PE32 )获得系统中的第一个进程信息并保存在PE32中
4Process32Next( hsnapShot , PE32 )遍历进程
5strcmp( PE32->szExeFile , "notepad.exe" )和你要找的进程名比较
6 Over
DWORD *lpidProcess, // array of process identifiers
DWORD cb, // size of array
DWORD *cbNeeded // number of bytes returned
);
直接返回当前所有的进程ID,遍历就可以得到notepad的ID了。
{
DWORD PID;
PROCESSENTRY32 pe32 = {0};
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapShot != (HANDLE) -1)
{
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hSnapShot, &pe32))
{
while (Process32Next(hSnapShot, &pe32))
{
if (_stricmp(pe32.szExeFile, FullProcessName) == 0)
{
PID = pe32.th32ProcessID;
break;
}
}
}
}
CloseHandle(hSnapShot);
return PID;
}