假如进程A的主线程(id是Ta)创建了一个窗口Wa,我怎么在进程B中获得线程Ta的主窗口句柄HWnd(Wa)?
我的想法是枚举线程Ta的所有窗口,找到一个风格为ws_popup的窗口,但是这样做是有问题的,
请问有何更好的方式没?
我的想法是枚举线程Ta的所有窗口,找到一个风格为ws_popup的窗口,但是这样做是有问题的,
请问有何更好的方式没?
解决方案 »
- %x 有没有这个输出符号啊,一个函数里能同时包含%s和%x吗,下面的这个输出就是没看明白,3通宵了,求真心
- 该用什么文件来保存不停地数据记录?txt/xml/Access数据文件!
- 急,初学者关于动态加载位图的问题
- 关于java线程池的。 欢迎讨论。q提问 a回答
- MFC基础,求教。。。。
- 急,急,急!!!怎么从DLL文件得到相应的LIB文件?
- CWnd::Paint()函数怎么使用,以及BeginPaint(),EndPaint()函数(UP有分)
- 高分求教,画图
- 我是小鸟请问---用ODBC编数据库程序时怎样创立和删除一个表。
- 我不知道应该在draw函数里怎么写代码来实现,请帮帮我!!!
- 非模态对话框隐藏后不失去焦点?
- 关于写文件
通过枚举顶层窗口,通过GetWindowThread函数来获得线程ID来比较
我试过了EnumWindows,它枚举的顶层窗口满足不了我的要求,我要的是某线程的主窗口Wa,但是Enumwindows会将Wa创建的子窗口也给枚举出(比如DoModal了一个对话框,AfxMessageBox等)这些子窗口同主窗口时同一个线程的,反向获取它们的线程id也肯定是相同的,所以无法实现我的需求.还有什么办法没?
The EnumWindows function enumerates all top-level windows on the screen by passing the handle to each window, in turn, to an application-defined callback function. EnumWindows continues until the last top-level window is enumerated or the callback function returns FALSE.
#include "CMWnd.h" //class CMWnd
UINT B(ULONG 参数1,)
{
CMWnd *pW;
pW = (CMWnd *) 参数1;
pW->xxxxxx;
}
BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
{
if(hwnd==NULL)
{
return FALSE;
}
if (IsWindowVisible(hwnd))
{
CListCtrl* pList=(CListCtrl*)lParam;
int nItem=pList->GetItemCount();.....
//获得窗口标题
CString strWindowText=_T("");
::GetWindowText(hwnd,strWindowText.GetBuffer(256),256);
strWindowText.ReleaseBuffer();
pList->SetItemText(nItem,1,strWindowText);
}
return TRUE;
}void CTDlgDlg::OnBnClickedButton1()
{
CListCtrl* pList=(CListCtrl*)GetDlgItem(IDC_LIST);
pList->DeleteAllItems();
pList->SetRedraw(FALSE);
//枚举窗口
::EnumWindows(EnumWndProc,(LPARAM)pList);
pList->SetRedraw();
}以上是我的测试代码,
假如Wa创建了一个弹出窗口,那么弹出窗口和主窗口,都被枚举了出来,它们在同一个线程中.
所以这个时候反向获取id是没有办法区分哪个才是主窗口的.-----------------------------------
现在看来貌似是没有办法区分主窗口了. 再等一晚,明天过来结贴.