我的程序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;
}这些函数我都实验过了,都不能到达我要的效果,也就是说最顶层窗口没有收到消息。
还有什么其他函数么?还是有其他方法?请高人指点,谢谢
我现在随意打开了一个子窗口。我在另外一个程序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;
}这些函数我都实验过了,都不能到达我要的效果,也就是说最顶层窗口没有收到消息。
还有什么其他函数么?还是有其他方法?请高人指点,谢谢
while(hFather!=NULL)
hFatherGetWindow(hFather,GW_OWNER);
hFather已经是NULL,如何得到最顶层的句柄,是不是需要一个变量来保存,hPreWnd;如下:
hFather=this->m_hWnd;
while(hFather!=NULL){
hPreWnd = hFather;
hFather = GetWindow(hFather,GW_OWNER);
}窗口1 ---->打开 窗口2 ----->打开 窗口3 。窗口1和 窗口3算是父子么?
CDlg1 dlg1;
dlg1.domodel();在CDlg1中又继续:
CDlg2 dlg2;
dlg2.domodel();
CDlg1 dlg1(父窗口句柄) 一般是this->m_hWnd
dlg1.DoModel()这样才具有父子关系
CDlg1 dlg1(this->m_hWnd);
dlg1.domodel(); 在CDlg1中又继续:
CDlg2 dlg2(this->m_hWnd);
dlg2.domodel(); MainDlg 和 dlg2 又是什么关系?在 MainDlg中 通过hFather = GetWindow(hFather,GW_OWNER); 能得到dlg2的句柄么?
应该在MainDlg中:
CDlg1 dlg1(this->m_hWnd);
dlg1.domodel(); 在CDlg1中又继续:
CDlg2 dlg2(this->m_hWnd);
dlg2.domodel();
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和循环结构也应该可以。