关于获取子窗口句柄 FindWindowEx 问题

bao20080513shengbin 2009-06-05 10:14:57
我有一个VC 的对话框程序 ,一个主对话框,两个子对话框,现在需要一个子对话框向另外一个子对话框发送消息,现在问题是如何获取 子对话框句柄,在发送消息时使用。我用了以下代码,但出错,麻烦大家看看,帮帮。


CWnd *pWnd = GetParent();
HWND hwndp = pWnd->GetSafeHwnd();

HWND hwnd = ::FindWindowEx(hwndp, NULL, "CDLGDraw", NULL);//CDLGDraw 要获取子窗口的对应类名
::SendMessage(hwnd, WM_EditChanged, NULL, NULL);

DWORD error = GetLastError();
error = 1400 无效的窗口句柄

如何做,是不是这样做的,还是另外有好的办法,请大家详细说说,特别感谢。
...全文
2068 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
CPU 占用率高是因为我测试时,消息响应函数中写了个 MessageBox ,去了就好了,这个我也不知何因。但到此为止,我的问题解决了,不能发送到目的地的消息发通了。
开始我把问题想的太复杂了些,后来经各位好友的帮忙,慢慢调整了过来。也学到了东西.

这里特别感谢 stjay jasonM2008 以及所有给予帮助的人。谢谢

stjay 2009-06-07
  • 打赏
  • 举报
回复
SendMessage 不会占用 100% CPU 啊
是不是循环 SendMessage 了

贴上代码才能分析啊
  • 打赏
  • 举报
回复
我按第一种方法做了一下,执行到SendMessage 时CPU 占用率 100% 不知为何
stjay 2009-06-07
  • 打赏
  • 举报
回复
没具体代码,凑着看吧,看懂思路,代码就出来了
一.子对话框间直接发送消息
以子对话框1 为例,其他的子对话框照搬
(1)在子对话框1 中添加变量 HWND m_hDlg2 (或 CWnd *m_pDlg2), m_hDlg3等
(2)在子对话框1 添加接口函数
如CDlg1::SetDlgHwnd(HWND hDlg2/*HWND hDlg3,HWND hDlg4,...*/)
{
m_hDlg2=hDlg2;
...
}
(3)在主对话框中
m_dlg1.Create(...);//m_dlg1 对应 子对话框1,下面的类同
m_dlg2.Create(...);
...

m_dlg1.SetDlgHwnd(m_dlg2.GetSafeHwnd()/*...*/);//将其他对话框句柄保存进来
(4)之后可以在子对话框1 中::SendMessage(m_hDlg2,...);

二.通过主对话框中转消息
(1)在子对话框1 中向主对话框发消息 GetParent()->SendMessage(msg,wparam,lparam/*这里传入1*/)
(2)主对话框 中对应的消息函数

CMainDlg::OnMyMsg(UINT msg,WPARAM wparam,LPARAM lparam) //大概这样子
{
switch(lparam) //根据lparam(或wparam)来判断操作哪个子对话框
{
case 1:
m_dlg1.xxx //子对话框1 的
break;
case 2:
m_dlg2.xxx //自行定义吧
break;
...

}
}

还有更好的么?来研究研究
jasonM2008 2009-06-06
  • 打赏
  • 举报
回复
WM_EditChanged 是你自己定义的消息吧!你最好贴出所有代码出来,要不让通过这么短短的一个函数,实在是看不出来什么问题!知道吗?
  • 打赏
  • 举报
回复
我就写了个消息通知,关键代码就这一句,其它就是两个对话框的消息定义声明什么的。再就没有什么了。不知什么问题。
jasonM2008 2009-06-06
  • 打赏
  • 举报
回复
这个函数没有用错,你得把你的怀疑有问题的代码都贴出来才好帮你!!!你贴出来,我看看!应该不是大问题!
  • 打赏
  • 举报
回复
懂是懂了,也没有任何语法错误了,但还是没有对,我写上::SendMessage(m_pDLGDraw->m_hWnd, WM_EditChanged, NULL, NULL);运行时就卡了。不知何因,SendMessage 第一个参数不就是要传递消息的窗口的句柄吗?有什么不对呢,
jasonM2008 2009-06-06
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 bao20080513shengbin 的回复:]
哎,可两个对话框不能互相包含对方头文件呀,第一个子对话框中已经包含了第二个子对话框的头文件。在第二个子对话框中不能访问第一个子对话框中的数据成员,子对话框也不能再包含主对话框的头文件,这样是不是 就只能以 “子对话框的类名,或ID号获取句柄了呢”
[/Quote]不需要包含头文件,直接向前声明类,像这样,在你要应用A 类的B 类的头文件中这样

class A;
class B
{
.......
a *pa;
};

然后在B.cpp的文件中包含A的头文件!

同样对A 也是!,当然你只能在B中声明A 的指针,然后在构造中new 一个对象就可以了!!!
懂了没??

  • 打赏
  • 举报
回复
哎,可两个对话框不能互相包含对方头文件呀,第一个子对话框中已经包含了第二个子对话框的头文件。在第二个子对话框中不能访问第一个子对话框中的数据成员,子对话框也不能再包含主对话框的头文件,这样是不是 就只能以 “子对话框的类名,或ID号获取句柄了呢”
ahao 2009-06-05
  • 打赏
  • 举报
回复
真奇怪,子窗口都是你自己创建的,你会不知道他们的句柄??
yxq281426250 2009-06-05
  • 打赏
  • 举报
回复
学习....
码侬 2009-06-05
  • 打赏
  • 举报
回复
CWnd *pWnd=CWnd::FindWindow(NULL,"子窗口标题");

也可以枚举窗口试试:
HWND hWndNext = ::GetWindow(NULL, GW_CHILD);   
while (hWndNext != NULL)
{
// ...
hWndNext = ::GetWindow(hWndNext, GW_HWNDNEXT);
}
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 oyljerry 的回复:]
引用 4 楼 bao20080513shengbin 的回复:
主要是两个子对话框要实时交换信息。我觉得只有发送消息才能做到实时变化,就用到了 SendMessage


两个子对话框可以通过父对话框等,保存各自的对话框对象指针等,然后通过指针来调用对应的函数等来传递信息
[/Quote]

但你说的我看的不是很懂,
我试试看,
我的两个 子对话框 是没有标题的那种。
majun01 2009-06-05
  • 打赏
  • 举报
回复
关注...

用FindWindowEx(hwndParent,NULL,NULL,"子窗口标题")试试。
oyljerry 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bao20080513shengbin 的回复:]
主要是两个子对话框要实时交换信息。我觉得只有发送消息才能做到实时变化,就用到了 SendMessage
[/Quote]
两个子对话框可以通过父对话框等,保存各自的对话框对象指针等,然后通过指针来调用对应的函数等来传递信息
  • 打赏
  • 举报
回复
主要是两个子对话框要实时交换信息。我觉得只有发送消息才能做到实时变化,就用到了 SendMessage
Ryanwen 2009-06-05
  • 打赏
  • 举报
回复
父子窗口没必要用FindWindow这么麻烦,子窗口GetParent强制转换,父窗口中有子窗口指针,直接用就可以
greatws 2009-06-05
  • 打赏
  • 举报
回复
没有必要用FindWindow
主对话框应该存有2个子对话框的对象或者指针吧?

比如说A B C 3个对话框
在一个对框B里调用GetParent()获得主对话框指针,强制转换成A*,然后访问C在A类中的指针或者对象,调用它的方法就行了。
fishion 2009-06-05
  • 打赏
  • 举报
回复
你对m_DLGDraw进行操作就行了,m_DLGDraw.m_hWnd就是窗口句柄
加载更多回复(9)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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