MFC子窗口获取子窗口句柄

liu631158765 2015-05-20 05:04:50
假设我现在有三个窗口A,B,C,三个窗口的基类我填的都是CDialog,在A窗口类中我定义个指针CDialog m_dia;
并在A中用m_dia创建两个子窗口B,C,用m_dia->create()和showwindow()显示;B和C窗口的属性我都设置为
无边框,和child属性,
然后问题来了,我想在窗口B的类中向窗口C发送个自定义消息,也就是子窗口向子窗口发消息,
但是C的句柄我怎么都获取不到,
FindWindow();的话得知道标题名,但我的子窗口设置为无边框,属性栏中标题栏变灰设置不了,填类名也找不到
GetDlgItem的话我在B窗口中C还没有创建,我是需要在B中再Create创建一次C??另一个子窗口句柄怎么获取呢?
...全文
545 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
笨笨仔 2015-05-20
  • 打赏
  • 举报
回复
最好的方法是B、C通过A完成控制,当然,如果你真的想让B、C间直接通信也可以,比如:A在创建完成B、C后,对B、C进行初始化,将C、B指针发给窗口作为成员变量保存起来,由此可建立B、C间的通信。以上所的说的通信指自定义消息。
worldy 2015-05-20
  • 打赏
  • 举报
回复
每个窗口变量里都有个成员m_hWnd,直接使用就是了
shenyi0106 2015-05-20
  • 打赏
  • 举报
回复
引用 2 楼 liu631158765 的回复:
我是在父窗口里Create的两个子窗,在父窗口里边当然能找到句柄,我想在其中一个子窗口类中获取另一个子窗口的句柄,这时候在B里不是还没有C吗?
谁的孩子谁管!!!请记住这一点!不然你的关系会理不清的! 别人的孩子犯错误了,你能打么? 你的正确做法是,告诉其父亲,让其父亲来管教它!
洗洗睡去 2015-05-20
  • 打赏
  • 举报
回复
b向父窗口发消息,通过父窗口 来操作c
liu631158765 2015-05-20
  • 打赏
  • 举报
回复
我是在父窗口里Create的两个子窗,在父窗口里边当然能找到句柄,我想在其中一个子窗口类中获取另一个子窗口的句柄,这时候在B里不是还没有C吗?
shenyi0106 2015-05-20
  • 打赏
  • 举报
回复
看来你还不太了解windows的窗口机制,以及MFC中的CWnd代表什么。 你都Create了一个CDialog了,它不就是你的窗口(窗口句柄)么,还纠结怎么找到它?还是把《深入浅出MFC》在看一遍吧
VC获得进程ID获得主线程ID获得窗口句柄获得主窗口获得进程名 1.窗口类名 窗口句柄 窗口标题 窗口句柄 HWND FindWindow( LPCTSTR lpClassName, //窗口类名 可用 VC或者VS自带的Spy++查看 LPCTSTR lpWindowName //窗口标题 ); 举例: 以 记事本为例, 记事本 窗口类名 为:NotePad, 窗口标题 视按具体情况而定,假设为"新建 文本文档.txt - 记事本" 窗口类名 窗口句柄 TCHAR lpClassName[]=TEXT("NotePad"); HWND hWnd=::FindWindow(lpClassName,NULL); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 窗口标题 窗口句柄 TCHAR lpWindowName[]=TEXT("新建 文本文档.txt - 记事本"); HWND hWnd=::FindWindow(NULL,lpWindowName); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 2.窗口句柄 进程ID 窗口句柄 主线程ID 要使用到的函数: DWORD GetWindowThreadProcessId( HWND hWnd, //目标窗口句柄 LPDWORD lpdwProcessId //返回目标窗口对应进程ID ); 例: DWORD dwProcId=0;//存放返回的进程ID DWORD dwThreadId=0;//存放返回的主线程ID HWND hWnd=XXXX;//这里省略,可能用任务方式得到一个窗口句柄.比如用1中的方法. dwThreadId=GetWindowThreadProcessId(hWnd,&dwProcId);//同时得到进程ID和主线程ID. 3.窗口HAND CWnd 用CWnd::FromHandle(HWND hWnd)函数.很多类都有这个函数. 4.进程名 进程ID (注:进程名,即在"任务管理器"中看到的名字) 用CCheckObject类(详细实现源文件); 例: 以记事本为例,进程名为 NOTEPAD.EXE (不一定是大写哦,得到任务管理器是显示而定); CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwProcId=ch.GetProcessId(Name); 5. 进程名 主线程ID 例: CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwThreadId=ch.GetThreadId(Name); 6. 进程名 主窗口句柄 CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); HWND hWnd=ch.GetTargetWindowHanle(Name); 7. 其它说明 从CCheckObject类和上面的源码中,不难写出从 进程ID 主线程ID 进程ID 主窗口句柄 主线程ID--->主窗口句柄 等等其它类似转换. 对于主窗口,特点如下: A. 不能用进程ID,要用线程ID,因为一个进程可能有多个线程,每个线程都可能会有主窗口. B. 主窗口不会有WS_CHILD属性 C. 主窗口没有父窗口 D. 主窗口一般都有窗口(这个不是一定的,但是具有普遍性)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧