我的程序A中,主窗口能打开多个子窗口,子窗口又能打开多个子窗口,
我现在随意打开了一个子窗口。我在另外一个程序B中,发送了一条消息给程序A,程序A接收到这个消息后,要通知当前处在最上层的这个窗口显示信息。LRESULT CMainDlg::OnMyNoTify(WPARAM wparam,LPARAM lparam) //自定义的消息
{
//HWND hWnd= ::GetTopWindow(m_hWnd);
//HWND hWnd= ::GetActiveWindow();
//HWND hWnd= ::GetForegroundWindow();
//HWND hWnd= ::GetTopWindow(NULL);
//HWND hWnd= ::GetWindow(m_hWnd,GW_CHILD);
         //::SendMessage(hWnd,UM_TEST,0,0); //CWnd* p = GetTopWindow();
//CWnd* p = GetActiveWindow();
//CWnd* p = GetForegroundWindow();
//CWnd* p = GetTopWindow();
CWnd* p = GetWindow(GW_CHILD);
         ::SendMessage(p1->m_hWnd,UM_TEST,0,0);
return 0;
}这些函数我都实验过了,都不能到达我要的效果,也就是说最顶层窗口没有收到消息。
还有什么其他函数么?还是有其他方法?请高人指点,谢谢

解决方案 »

  1.   

    不行,用B发消息给A,A用 ::GetForegroundWindow(); 得到当前最顶层窗口,因为现在的的最顶层窗口是B,所以 ::GetForegroundWindow(); 得到的是B的句柄,所以达不到效果
      

  2.   

    GetWindow 用GW_OWNER 一直向上找,直到返回NULL为止,那么获得的句柄就是最顶层的句柄HWND hFather=this->m_hWnd;
    while(hFather!=NULL)
       hFatherGetWindow(hFather,GW_OWNER);
      

  3.   


    hFather已经是NULL,如何得到最顶层的句柄,是不是需要一个变量来保存,hPreWnd;如下:
    hFather=this->m_hWnd;
    while(hFather!=NULL){
       hPreWnd = hFather;
       hFather = GetWindow(hFather,GW_OWNER);
    }窗口1 ---->打开 窗口2 ----->打开 窗口3 。窗口1和 窗口3算是父子么?
      

  4.   

    HWNAD hwnd = FindWindows("A",null);
      

  5.   

    你是不是先new,然后Create,最后Show的?
      

  6.   

    不是,是下面这样:
    CDlg1 dlg1;
    dlg1.domodel();在CDlg1中又继续:
    CDlg2 dlg2;
    dlg2.domodel();
      

  7.   

    这样不行,要这样
    CDlg1 dlg1(父窗口句柄) 一般是this->m_hWnd
    dlg1.DoModel()这样才具有父子关系
      

  8.   

    在MainDlg中:
    CDlg1 dlg1(this->m_hWnd); 
    dlg1.domodel(); 在CDlg1中又继续: 
    CDlg2 dlg2(this->m_hWnd); 
    dlg2.domodel(); MainDlg 和 dlg2 又是什么关系?在 MainDlg中 通过hFather = GetWindow(hFather,GW_OWNER); 能得到dlg2的句柄么?
      

  9.   

    用B发消息给A,A用 ::GetForegroundWindow(); 得到当前最顶层窗口,因为现在的的最顶层窗口是B,所以 ::GetForegroundWindow(); 得到的是B的句柄,所以达不到效果
    应该在MainDlg中: 
    CDlg1 dlg1(this->m_hWnd); 
    dlg1.domodel(); 在CDlg1中又继续: 
    CDlg2 dlg2(this->m_hWnd); 
    dlg2.domodel(); 
      

  10.   

    1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)   HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)2.HWND WindowFromPoint(POINT& Point)3.BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)   BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)   BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)   BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)对于第一种,大家都很熟悉,是捕捉句柄的常规武器,FindWindow这两兄弟,可以接受捕捉对象的类名或者窗口标题之一,作为参数,返回一个HWND。可是对于一般群众,不一定知道所有的窗口(包括标题栏、按钮等等)的类名啊!——可以简单举例,请问你知道桌面图标的窗口的类名吗?而对于窗口标题,有可能会出现相同的标题,有两个窗口——指一个程序的两个进程,这又是个麻烦吧!好了,这个问题先放放,继续下一组。       第二组,通过win32定义的POINT结构(typedef struct tagPOINT {   LONG x;
    LONG y;} POINT),来获得当前鼠标光标位置的窗口HWND,这是最直观的武器!常规操作如下:先得到Cursor的POINT(BOOL GetCursorPos(LPPOINT)函数),再用WindowFromPoint。这样,我们几乎可以获得任何打开的有窗口的函数的HWND了!然后通过获取类名的win32 api函数(int GetClassName( HWND hWnd,   LPTSTR lpClassName,  int nMaxCount ))得到类名——这里的lpClassName最好用字符数组地址,nMaxCount就是数组的size了,同时,这种方法解决了第一个问题的麻烦!——我可以把鼠标放在任何地方!*^_^*       第三组,这些是用来列举和处理任何窗口的超级武器!通过组合运用EnumWindows和EnumWindowsProc,EnumChildWindows与EnumChildProc,可以扫描桌面所有窗口并对之处理!我的理解:(这部分用任务驱动式教学方法——谁让小弟是老师呢!xi xi)任务:得到所有的窗口的类名。解决办法1:我们会先想到第三组,可以自桌面窗口开始(它是所有窗口的祖先),依次扫描,获取类名并存之。有点儿像Visual Stdio的Spy++,或者Borland 的WinSight32,具体办法如下:(bcb中)在主程序中,调用EnumWindows,传入YouEnumProc的函数地址作第一个参数,别忘了转换成WNDENUMPROC类型。第二参可NULL。::EnumWindows(reinterpret_cast<WNDENUMPROC> YouEnumProc,NULL);在YouEnumProc函数中,如果第一参HWND = = NULL,就跳离(return FALSE;),可以结束啦!然后,把类名数组准备好,得到类名,存之。返回真值,继续下一次扫描。看起来并不复杂,是一种函数递归。第二种解决方法:简单、直观首先准备一个时钟,一种存类名方法(我用TMemo)在定时器处理函数中:1、得到当前cursor的点位置2、再用WindowFromPoint,3、然后得到类名,放到TMemo里第三种方法:其实利用FindWindow和循环结构也应该可以。