永发信息网

跟据进程号获取进程句柄

答案:1  悬赏:70  手机版
解决时间 2021-01-21 08:56
跟据进程号获取进程句柄
最佳答案
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 取得句柄 和通过 进程名 取得句柄。
------解决方案-------------------------------------------------------- 你CreateProcess直接将HWND作为命令行参数、或者环境变量参数传递给子进程,在子进程中解析一下即可。用环境变量的方法与下面类似GetEnvironmentStrings();具体使用参考MSDN文档C/C++ code // 父进程创建子进程,将自己的HWND窗口句柄作为参数传递到子进程中。 STARTUPINFO si = {sizeof(si)}; PROCESS_INFORMATION pi = {0}; TCHAR szAppPath[MAX_PATH] = {0}; _stprintf(szAppPath, _T(%s 0x%x), _T(F:\\11.exe), GetSafeHwnd()); if(CreateProcess(NULL, szAppPath, NULL, NULL, FALSE, NULL, NULL, NULL, &si ,&pi)){CloseHandle(pi.hThread); CloseHandle(pi.hProcess);}else{DWORD dwRet = GetLastError(); CString str; str.Format(_T(%d), dwRet); AfxMessageBox(str);} // 子进程中解析命令行即可
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
樟木球放柜保存期限
我试管婴儿第二次失败了,是什么原因
为什么我这么不成熟?
欣兰黑里透白冻膜一周用几次
“缕”字开头的成语有哪些?
求一首原创诗 现代诗也可以 题材:冬天的夜晚
"然始也可由剥以使之复继也"是什么意思
22.34到3.13总共花了多少小时,这个怎么算
三星地址好找么,我有些事要过去,
下列物质能导电且为电解质的是A.K2SO4晶体B.
oracle DBA是什么用户?
女主叫顾暖的小说
黑莓8820最大支持多大的内存卡!?(要有图!
根据一根茄子说一句话
床单被罩被子之类的是统一的吗
推荐资讯
关于唐代诗人李白的诗紫阳山人书印是什么朝代
求种植鱼腥草技术和种子?
宫崎骏的成名作是哪部?
精神与品质的意思相同吗?
今年周岁21岁 属什么 那一年的
无期限和无限期有什么区别?
00年阴历六月二十七女孩命运
每出必携书
世纪明德明晶晶
我的电脑键盘一打o键,为什么就出来一个+号
咨询下,在哪可以买到质量靠谱的军工级转轴?
湖南纬德大宗好吗?有办做过的吗
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?