通过进程ID获得该进程主窗口的句柄

作者: admin 分类: Windows api 发布时间: 2014-03-18 10:09 ė3,091 浏览数 6没有评论
文章转自王牌软件
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)

一个进程可以拥有很多主窗口,也可以不拥有主窗口,所以这样的函数是不存在的,所幸的是,相反的函数是有的。所以我们可以调用EnumWindows来判断所有的窗口是否属于这个进程。

typedef struct tagWNDINFO
…{
DWORD dwProcessId;
HWND hWnd;
} WNDINFO, *LPWNDINFO;

BOOL CALLBACK YourEnumProc(HWND hWnd,LPARAM lParam)
…{
DWORD dwProcessId;
GetWindowThreadProcessId(hWnd, &dwProcessId);
LPWNDINFO pInfo = (LPWNDINFO)lParam;
if(dwProcessId == pInfo->dwProcessId)
…{
pInfo->hWnd = hWnd;
return FALSE;
}
return TRUE;
}
HWND GetProcessMainWnd(DWORD dwProcessId)
…{
WNDINFO wi;
wi.dwProcessId = dwProcessId;
wi.hWnd = NULL;
EnumWindows(YourEnumProc,(LPARAM)&wi);
return wi.hWnd;
}
如果这个进程没有窗口,函数返回NULL
经试验,在宿主窗口中调用GetProcessMainWnd( GetCurrentProcessId() )后得到的窗口句柄有时确实是该窗口的句柄,但有时得到的却是DLL的窗口的句柄,而在DLL的窗口过程中调用GetProcessMainWnd( GetCurrentProcessId() )只得到DLL窗口的句柄,并不能得到宿主窗口的句柄。【将dll直接注入执行注入代码的exe中进行测试】

将该代码做如下修改后,能得到正确的宿主窗口句柄:

 

typedef struct tagWNDINFO
…{
DWORD dwProcessId;
HWND hWnd;
HWND Dll_hwnd;
} WNDINFO, *LPWNDINFO;
BOOL CALLBACK YourEnumProc(HWND hWnd, LPARAM lParam)
…{
DWORD dwProcessId;
GetWindowThreadProcessId(hWnd, &dwProcessId);
LPWNDINFO pInfo = (LPWNDINFO)lParam;
if( (dwProcessId == pInfo->dwProcessId) && (hWnd != pInfo->Dll_hwnd) )
//确认找到的句柄不是DLL窗口的句柄
//如果找到的是DLL窗口的句柄则返回FALSE以便继续查找宿主的窗口句柄
…{
pInfo->hWnd = hWnd;
return FALSE;
}
return TRUE;
}
HWND GetProcessMainWnd(DWORD dwProcessId, HWND Dll_hwnd)
//将DLL窗口的句柄传入,以便识别找到的句柄不是DLL窗口的句柄
…{
WNDINFO wi;
wi.dwProcessId = dwProcessId;
wi.hWnd = NULL;
wi.Dll_hwnd = Dll_hwnd;
EnumWindows(YourEnumProc,(LPARAM)&wi);
HWND re_hwnd = wi.hWnd;
while( GetParent(re_hwnd) != NULL )
//循环查找父窗口,以便保证返回的句柄是最顶层的窗口句柄
…{
re_hwnd = GetParent( re_hwnd );
}
return re_hwnd;
}
在DLL的窗口过程中调用GetProcessMainWnd( GetCurrentProcessId(), this->m_hWnd )即可获得宿主窗口的句柄。
【备注】如果宿主进程已经调用了其它DLL并且该DLL也创建有窗口,那么,我想这个代码并不能保证得到的句柄不是其它DLL的窗口句柄,要做进一步的识别,我想,靠这个方法还是难以实现的了,或许可以考虑在注入DLL时(或注入之后?)传递该宿主窗口的句柄给DLL。
文章出处:http://www.diybl.com/course/4_webprogram/asp.net/asp_netshl/2008510/115369.html



只回答业务咨询点击这里给我发消息 点击这里给我发消息

学习日记,兼职软件设计,软件修改,毕业设计。

本文出自 学习日记,转载时请注明出处及相应链接。

本文永久链接: https://www.softwareace.cn/?p=736

0

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">


Ɣ回顶部

无觅相关文章插件,快速提升流量