通过进程ID获得该进程主窗口的句柄
来源:互联网 发布:c语言退出程序代码 编辑:程序博客网 时间:2024/04/29 05:31
一个进程可以拥有很多主窗口,也可以不拥有主窗口,所以这样的函数是不存在的,所幸的是,相反的函数是有的。所以我们可以调用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;
}
以上转自网上,判断是否是主窗口的方式不一定好用,还需要更多的窗口信息人为来判断!!
- 通过进程ID获得该进程主窗口的句柄
- 通过进程ID获得该进程主窗口的句柄
- 通过进程ID获得该进程主窗口的句柄
- 通过进程ID获得该进程主窗口的句柄或者获得特定窗口句柄
- 通过进程ID获得主窗口句柄
- 通过进程ID获得主窗口句柄
- 通过进程号ID获得窗口的句柄
- 通过进程号ID获得窗口的句柄 .
- 通过进程号ID获得窗口的句柄
- 通过进程ID获取进程主窗口句柄
- 进程句柄HANDLE获得进程主窗口的句柄HWND
- win2k窗口句柄获得进程id
- 如何根据进程id获取该进程的主窗口句柄
- 通过创建窗口进程的ID来查找窗口句柄
- 通过进程ID找到窗口句柄
- 通过进程Id获取窗口句柄
- 通过进程id获取窗口句柄
- 通过Windows进程ID获取窗口句柄
- Linux内核链表的研究与应用
- 经典SQL语句大全()
- JAVA 与C++ 混合编程 Java中调用C/C++生成的DLL(转)
- 我的重构初体验
- jquery异步传输3种不同数据类型html、xml、json
- 通过进程ID获得该进程主窗口的句柄
- C++和OC的区别
- 枚举的用法
- 天天记录 - Android invalidate学习使用的例子
- win8安装sql server2005方法
- Android事件分发onInterceptTouchEvent与onTouchEvent
- 通过JNI实现Java和C++的相互调用
- iOS手势
- OOM