高分求解。VC++ 通过进程名或进程ID获取进程句柄
intEnumWindowsProc(HWNDhwnd,int*lParam);PROCESSENTRY32Pn;//定义一个结构体extern"C"_declspec(...
int EnumWindowsProc(HWND hwnd,int *lParam);
PROCESSENTRY32 Pn;//定义一个结构体
extern "C" _declspec(dllexport) int __stdcall ProcessNameToHWND(LPCWSTR ProcessName)//进程名获取窗口句柄
{
HANDLE sHandle = ::CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);//创建进程快照,他的第一个参数的意思是包含所有!
Pn.dwSize = 296;//设置大小
int ret;
int Found = ::Process32FirstW(sHandle,&Pn);//进程获取函数!
while(Found != 0)
{
if (lstrcmpi(SysAllocStringByteLen((LPCSTR)Pn.szExeFile,260),ProcessName))//lstrcmpi 比较字符串的值 若第一个字符串比第二个字符串小则返回值为负;若第一个字符串比第二个字符串大则返回值为正;若两个字符串相等则返回值为0。SysAllocStringByteLen 申请一个指定字节长度的 BSTR 指针,并初始化为一个字符串
{
ret = Pn.th32ProcessID;
EnumWindows((WNDENUMPROC)EnumWindowsProc,ret);
break;
}
Found = Process32NextW(sHandle,&Pn);//获得下一个进程的句柄
}
CloseHandle(sHandle);
return ret;
}
int EnumWindowsProc(HWND hwnd,int *lParam)
{
static int *oldPID;//静态变量
int *lpPid;
if (oldPID == 0)
{
oldPID = lParam;
}
GetWindowThreadProcessId(hwnd,(LPDWORD)lpPid);//找出某个窗口的创建者(线程或进程),返回创建者的标志符。
if (oldPID == lpPid)
{
lParam = (int *)hwnd;
return 0;
}
return 1;
}
int EnumWindowsProcess(int hwnd,int *lParam);
extern "C" _declspec(dllexport) int __stdcall ProcessIDToHwnd(int ProcessID)
{
EnumWindows((WNDENUMPROC)EnumWindowsProcess,ProcessID);
return ProcessID;
}
int EnumWindowsProcess(HWND hwnd,int *lParam)
{
static int *oldPID;//静态变量
int *lpPid;
if (oldPID == 0)
{
oldPID = lParam;
}
GetWindowThreadProcessId(hwnd,(LPDWORD)lpPid);
if (lpPid == oldPID)
{
lParam = (int *)GetAncestor(hwnd,GA_ROOTOWNER);//取祖宗。....只知道翻译。不知道啥意思
return 0;
}
else
{
lParam = 0;
return 1;
}
}
没法编译 错误就不列出来了,太多了 希望知道的朋友帮我修改完毕 然后发上来一份 谢谢!
主要实现 通过进程 ID 取得句柄 和通过 进程名 取得句柄。
的确好像是权限不够 获取不到进程句柄!
就这样吧,VISTA下不知道如何提权。 展开
PROCESSENTRY32 Pn;//定义一个结构体
extern "C" _declspec(dllexport) int __stdcall ProcessNameToHWND(LPCWSTR ProcessName)//进程名获取窗口句柄
{
HANDLE sHandle = ::CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);//创建进程快照,他的第一个参数的意思是包含所有!
Pn.dwSize = 296;//设置大小
int ret;
int Found = ::Process32FirstW(sHandle,&Pn);//进程获取函数!
while(Found != 0)
{
if (lstrcmpi(SysAllocStringByteLen((LPCSTR)Pn.szExeFile,260),ProcessName))//lstrcmpi 比较字符串的值 若第一个字符串比第二个字符串小则返回值为负;若第一个字符串比第二个字符串大则返回值为正;若两个字符串相等则返回值为0。SysAllocStringByteLen 申请一个指定字节长度的 BSTR 指针,并初始化为一个字符串
{
ret = Pn.th32ProcessID;
EnumWindows((WNDENUMPROC)EnumWindowsProc,ret);
break;
}
Found = Process32NextW(sHandle,&Pn);//获得下一个进程的句柄
}
CloseHandle(sHandle);
return ret;
}
int EnumWindowsProc(HWND hwnd,int *lParam)
{
static int *oldPID;//静态变量
int *lpPid;
if (oldPID == 0)
{
oldPID = lParam;
}
GetWindowThreadProcessId(hwnd,(LPDWORD)lpPid);//找出某个窗口的创建者(线程或进程),返回创建者的标志符。
if (oldPID == lpPid)
{
lParam = (int *)hwnd;
return 0;
}
return 1;
}
int EnumWindowsProcess(int hwnd,int *lParam);
extern "C" _declspec(dllexport) int __stdcall ProcessIDToHwnd(int ProcessID)
{
EnumWindows((WNDENUMPROC)EnumWindowsProcess,ProcessID);
return ProcessID;
}
int EnumWindowsProcess(HWND hwnd,int *lParam)
{
static int *oldPID;//静态变量
int *lpPid;
if (oldPID == 0)
{
oldPID = lParam;
}
GetWindowThreadProcessId(hwnd,(LPDWORD)lpPid);
if (lpPid == oldPID)
{
lParam = (int *)GetAncestor(hwnd,GA_ROOTOWNER);//取祖宗。....只知道翻译。不知道啥意思
return 0;
}
else
{
lParam = 0;
return 1;
}
}
没法编译 错误就不列出来了,太多了 希望知道的朋友帮我修改完毕 然后发上来一份 谢谢!
主要实现 通过进程 ID 取得句柄 和通过 进程名 取得句柄。
的确好像是权限不够 获取不到进程句柄!
就这样吧,VISTA下不知道如何提权。 展开
2个回答
展开全部
HANDLE GetProcessHandle(int nID)
{
return OpenProcess(PROCESS_ALL_ACCESS, FALSE, nID);
}
HANDLE GetProcessHandle(LPCTSTR pName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapshot) {
return NULL;
}
PROCESSENTRY32 pe = { sizeof(pe) };
BOOL fOk;
for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)) {
if (!_tcscmp(pe.szExeFile, pName)) {
CloseHandle(hSnapshot);
return GetProcessHandle(pe.th32ProcessID);
}
}
return NULL;
}
P.S.你的代码不够精炼,所以重新写了一个。你看下这个能用不,不能用再帮你找找你的错误。主要你的代码太长了,所以没细看,你的Pn酱紫初始化啊,还有既然是DLL的,那就应该分别做LPCWSTR和LPCSTR两个版本,看你在LPCSTR版本里还用Process32FirstW?,是不是有些混乱了?Pn被填充了UNICODE字符集再去和LPCSTR做比较,怎么能得出正确结果呢? 还有那个那个....连COM的东西也出来了,完全被雷倒了,休克中...
===================================
贴上来的代码都已很负责任的运行通过,不会有错.你再检查看看是由于什么引起编译错误.可以把出错信息贴上来.然后帮你分析看看.
另外,workingroy说要提权,DLL是不是应该自作主张提权有待商榷,提权完全可以由客户程序负责决定.可以在调用函数前提权,函数调用完恢复原来的权限.另外就是提权操作也有消耗,对于系统管理员身份运行(通常我们都是系统管理员身份登陆WINDOWS),不需要提权.当然,有高手指出,VISTA和7对系统管理员的权限已经有了修改,既是是系统管理员,权限也受到了某些限制.这个我没研究过.持保留意见.当然楼主的函数应该在提供一个参数,用来传递要打开的进程句柄的权限.一般不需要PROCESS_ALL_ACCESS的.
{
return OpenProcess(PROCESS_ALL_ACCESS, FALSE, nID);
}
HANDLE GetProcessHandle(LPCTSTR pName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapshot) {
return NULL;
}
PROCESSENTRY32 pe = { sizeof(pe) };
BOOL fOk;
for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)) {
if (!_tcscmp(pe.szExeFile, pName)) {
CloseHandle(hSnapshot);
return GetProcessHandle(pe.th32ProcessID);
}
}
return NULL;
}
P.S.你的代码不够精炼,所以重新写了一个。你看下这个能用不,不能用再帮你找找你的错误。主要你的代码太长了,所以没细看,你的Pn酱紫初始化啊,还有既然是DLL的,那就应该分别做LPCWSTR和LPCSTR两个版本,看你在LPCSTR版本里还用Process32FirstW?,是不是有些混乱了?Pn被填充了UNICODE字符集再去和LPCSTR做比较,怎么能得出正确结果呢? 还有那个那个....连COM的东西也出来了,完全被雷倒了,休克中...
===================================
贴上来的代码都已很负责任的运行通过,不会有错.你再检查看看是由于什么引起编译错误.可以把出错信息贴上来.然后帮你分析看看.
另外,workingroy说要提权,DLL是不是应该自作主张提权有待商榷,提权完全可以由客户程序负责决定.可以在调用函数前提权,函数调用完恢复原来的权限.另外就是提权操作也有消耗,对于系统管理员身份运行(通常我们都是系统管理员身份登陆WINDOWS),不需要提权.当然,有高手指出,VISTA和7对系统管理员的权限已经有了修改,既是是系统管理员,权限也受到了某些限制.这个我没研究过.持保留意见.当然楼主的函数应该在提供一个参数,用来传递要打开的进程句柄的权限.一般不需要PROCESS_ALL_ACCESS的.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询