跟据进程号获取进程句柄
答案:1 悬赏:70 手机版
解决时间 2021-01-21 08:56
- 提问者网友:遁入空寂
- 2021-01-21 00:37
跟据进程号获取进程句柄
最佳答案
- 五星知识达人网友:神的生死簿
- 2021-01-21 00:55
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);} // 子进程中解析命令行即可
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);} // 子进程中解析命令行即可
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯