- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
发表于 2011-3-20 09:08:35
|
显示全部楼层
你确实得先把dll的句柄给过滤掉,其实做个简单的判断就行了,我下面只能给出C++代码,不过相关的函数你应该能用得到
- 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;
- }
复制代码 |
|