两个窗口之间如何进行信息交换?

时间:2023-02-12 20:13:48
vs2012  mfc工程中

窗口A中放了一排按钮,窗口B中我创建了一些对话框,如何实现点击某个按钮对应显示某个对话框呢?

我首先用的全局变量,变量的值可以交换,但是对话框的状态不会更新,

我又用SendMessage, 结果在FindWindow这里 总是返回的空句柄,试了很久也不知怎么回事,

HWND hWnd = ::FindWindow(_T("类名“),_T("窗口名”));     函数是这么写的 用的vs2012   SPY++ 看过了类名跟窗口名都对,


我是新手,求高手指教一下,  这两个方法我哪里用错了?  还有什么方法可以实现两个窗口间的信息交换?

26 个解决方案

#1


窗口B中怎么创建一些对话口的?????

#2


你二个窗口是什么关系?平行关系?父子关系?

#3


引用 1 楼 hezhe1008 的回复:
窗口B中怎么创建一些对话口的?????



B.h

CDialog1 m_dlg1;
CDialog2 m_dlg2;
CDialog3 m_dlg3;


b.cpp

m_dlg1.Create();


对话框就是这么创建的    

#4


引用 2 楼 wxhxj0268 的回复:
你二个窗口是什么关系?平行关系?父子关系?



A窗口 跟B窗口是 平行关系, 派送于同一个类

#5


从A B的父窗口开始找

#6


HWND hWnd = ::FindWindow(_T("类名“),_T("窗口名”));  

不是_T("窗口名”) 而是窗口的标题(如"我的对话框")

#7


引用 5 楼 hezhe1008 的回复:
从A B的父窗口开始找


这个要怎么找?  能不能细说一下呢?

#8


类名是
//#32768  The class for a menu.
//#32769  The class for the desktop window.
//#32770   The class for a dialog box.
//#32771  The class for the task switch window.
//#32772  The class for icon titles.

#9


引用 6 楼 schlafenhamster 的回复:
HWND hWnd = ::FindWindow(_T("类名“),_T("窗口名”));  

不是_T("窗口名”) 而是窗口的标题(如"我的对话框")



对 ,  用的就是窗口的标题,

#10


推荐使用Spy4Win软件。

#11


你直接把B窗口的指针传递给A  A的按钮事件里面就b->显示某个窗口....

#12


同一进程还是不同进程?(一共运行了几个exe程序)

#13


我认为安全的作法是:A与B之间使用消息交换数据,由B派生的窗口中的控件,可在B中直接控制。即A要控制B中某窗口中的控件时,发消息给B,由B完成操作。

#14


引用 13 楼 wxhxj0268 的回复:
我认为安全的作法是:A与B之间使用消息交换数据,由B派生的窗口中的控件,可在B中直接控制。即A要控制B中某窗口中的控件时,发消息给B,由B完成操作。



SendMessage 需要B窗口的句柄,   我用FindWindow获取B的句柄 总是返回空,  纠结了很久 不知道哪里出问题了  

#15


引用 11 楼 yaozhiyong110 的回复:
你直接把B窗口的指针传递给A  A的按钮事件里面就b->显示某个窗口....


怎么传递? 新手而且读书少   能不能明示下..

#16


很奇怪的问题,
对话框的创建的指针值和按钮在一个类里面,想怎么操作怎么操作。

#17


引用 14 楼 caiziMain 的回复:
Quote: 引用 13 楼 wxhxj0268 的回复:

我认为安全的作法是:A与B之间使用消息交换数据,由B派生的窗口中的控件,可在B中直接控制。即A要控制B中某窗口中的控件时,发消息给B,由B完成操作。



SendMessage 需要B窗口的句柄,   我用FindWindow获取B的句柄 总是返回空,  纠结了很久 不知道哪里出问题了  

我在写此类程序时,为了使用方便会建立一个静态数据类,专门用于一些静态数据的引用和保存。在每个窗口建立后,在初始化时将窗口指针以窗口名为Key保存到静态类,需要者可通过Key获取,保证你不会出现空指针的问题。

#18


引用 15 楼 caiziMain 的回复:
Quote: 引用 11 楼 yaozhiyong110 的回复:

你直接把B窗口的指针传递给A  A的按钮事件里面就b->显示某个窗口....


怎么传递? 新手而且读书少   能不能明示下..


你直接构造的时候传过去或者用个成员函数调用的时候传过去都可以啊 或者 直接A.m_pDlgB=B 直接赋值也行...

#19


指针,在B中创建A的指针指向B,然后就是指针操作了

#20


http://bbs.csdn.net/topics/390124261

#21


该回复于2015-07-02 08:50:36被管理员删除

#22


该回复于2015-07-02 09:00:58被管理员删除

#23


1.SendMessage是推荐做法;
2.用::FindWindow(_T("类名“),_T("窗口名”))找窗口不好,应该放弃;
3.可以在窗口A、B中各自添加一个静态指针static CDialog*  pdlg并在OnInitialDlg()函数中为各自窗口指针赋值;
4.通过静态指针static随便发消息即可

#24


在父窗口中保留两个子窗口指针(存到成员变量中),A窗口获取父窗口的指针,然后返回其对保存的B窗口的指针,然后操作B窗口

#25


引用 23 楼 rxguoblp 的回复:
1.SendMessage是推荐做法;
2.用::FindWindow(_T("类名“),_T("窗口名”))找窗口不好,应该放弃;
3.可以在窗口A、B中各自添加一个静态指针static CDialog*  pdlg并在OnInitialDlg()函数中为各自窗口指针赋值;
4.通过静态指针static随便发消息即可



非常感谢,  FindWindow 不用了    一直不知道问题在哪里

#26


感谢大家的回答,非常的感谢, 问题已经解决,依然使用的SendMessage 

#1


窗口B中怎么创建一些对话口的?????

#2


你二个窗口是什么关系?平行关系?父子关系?

#3


引用 1 楼 hezhe1008 的回复:
窗口B中怎么创建一些对话口的?????



B.h

CDialog1 m_dlg1;
CDialog2 m_dlg2;
CDialog3 m_dlg3;


b.cpp

m_dlg1.Create();


对话框就是这么创建的    

#4


引用 2 楼 wxhxj0268 的回复:
你二个窗口是什么关系?平行关系?父子关系?



A窗口 跟B窗口是 平行关系, 派送于同一个类

#5


从A B的父窗口开始找

#6


HWND hWnd = ::FindWindow(_T("类名“),_T("窗口名”));  

不是_T("窗口名”) 而是窗口的标题(如"我的对话框")

#7


引用 5 楼 hezhe1008 的回复:
从A B的父窗口开始找


这个要怎么找?  能不能细说一下呢?

#8


类名是
//#32768  The class for a menu.
//#32769  The class for the desktop window.
//#32770   The class for a dialog box.
//#32771  The class for the task switch window.
//#32772  The class for icon titles.

#9


引用 6 楼 schlafenhamster 的回复:
HWND hWnd = ::FindWindow(_T("类名“),_T("窗口名”));  

不是_T("窗口名”) 而是窗口的标题(如"我的对话框")



对 ,  用的就是窗口的标题,

#10


推荐使用Spy4Win软件。

#11


你直接把B窗口的指针传递给A  A的按钮事件里面就b->显示某个窗口....

#12


同一进程还是不同进程?(一共运行了几个exe程序)

#13


我认为安全的作法是:A与B之间使用消息交换数据,由B派生的窗口中的控件,可在B中直接控制。即A要控制B中某窗口中的控件时,发消息给B,由B完成操作。

#14


引用 13 楼 wxhxj0268 的回复:
我认为安全的作法是:A与B之间使用消息交换数据,由B派生的窗口中的控件,可在B中直接控制。即A要控制B中某窗口中的控件时,发消息给B,由B完成操作。



SendMessage 需要B窗口的句柄,   我用FindWindow获取B的句柄 总是返回空,  纠结了很久 不知道哪里出问题了  

#15


引用 11 楼 yaozhiyong110 的回复:
你直接把B窗口的指针传递给A  A的按钮事件里面就b->显示某个窗口....


怎么传递? 新手而且读书少   能不能明示下..

#16


很奇怪的问题,
对话框的创建的指针值和按钮在一个类里面,想怎么操作怎么操作。

#17


引用 14 楼 caiziMain 的回复:
Quote: 引用 13 楼 wxhxj0268 的回复:

我认为安全的作法是:A与B之间使用消息交换数据,由B派生的窗口中的控件,可在B中直接控制。即A要控制B中某窗口中的控件时,发消息给B,由B完成操作。



SendMessage 需要B窗口的句柄,   我用FindWindow获取B的句柄 总是返回空,  纠结了很久 不知道哪里出问题了  

我在写此类程序时,为了使用方便会建立一个静态数据类,专门用于一些静态数据的引用和保存。在每个窗口建立后,在初始化时将窗口指针以窗口名为Key保存到静态类,需要者可通过Key获取,保证你不会出现空指针的问题。

#18


引用 15 楼 caiziMain 的回复:
Quote: 引用 11 楼 yaozhiyong110 的回复:

你直接把B窗口的指针传递给A  A的按钮事件里面就b->显示某个窗口....


怎么传递? 新手而且读书少   能不能明示下..


你直接构造的时候传过去或者用个成员函数调用的时候传过去都可以啊 或者 直接A.m_pDlgB=B 直接赋值也行...

#19


指针,在B中创建A的指针指向B,然后就是指针操作了

#20


http://bbs.csdn.net/topics/390124261

#21


该回复于2015-07-02 08:50:36被管理员删除

#22


该回复于2015-07-02 09:00:58被管理员删除

#23


1.SendMessage是推荐做法;
2.用::FindWindow(_T("类名“),_T("窗口名”))找窗口不好,应该放弃;
3.可以在窗口A、B中各自添加一个静态指针static CDialog*  pdlg并在OnInitialDlg()函数中为各自窗口指针赋值;
4.通过静态指针static随便发消息即可

#24


在父窗口中保留两个子窗口指针(存到成员变量中),A窗口获取父窗口的指针,然后返回其对保存的B窗口的指针,然后操作B窗口

#25


引用 23 楼 rxguoblp 的回复:
1.SendMessage是推荐做法;
2.用::FindWindow(_T("类名“),_T("窗口名”))找窗口不好,应该放弃;
3.可以在窗口A、B中各自添加一个静态指针static CDialog*  pdlg并在OnInitialDlg()函数中为各自窗口指针赋值;
4.通过静态指针static随便发消息即可



非常感谢,  FindWindow 不用了    一直不知道问题在哪里

#26


感谢大家的回答,非常的感谢, 问题已经解决,依然使用的SendMessage