其实我要实现的功能非常的简单,就是B窗口获得A窗口上CIPAddressCtrl控件的值。
在A窗口上获得很好弄,
CIPAddressCtrl* m_Address=(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1);
这一句话就行了,但是跨窗口访问就太难了。我查了一下,需要API函数GetDlgItem(hWnd,IDC_IPADDRESS1)
这样来弄,其中hWnd是A窗口的句柄,但是B窗口如何获得A窗口的句柄呢?我试了好多方法都不行,请大家帮帮忙!
另外我在百度发了贴,有两个回答:
1:太简单了,让别人回答
2:用个全局变量来保存A窗口的指针。(但我不知道何时在哪里如何来获得A窗口的指针)希望大侠们给出具体代码。
谢谢!
在A窗口上获得很好弄,
CIPAddressCtrl* m_Address=(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1);
这一句话就行了,但是跨窗口访问就太难了。我查了一下,需要API函数GetDlgItem(hWnd,IDC_IPADDRESS1)
这样来弄,其中hWnd是A窗口的句柄,但是B窗口如何获得A窗口的句柄呢?我试了好多方法都不行,请大家帮帮忙!
另外我在百度发了贴,有两个回答:
1:太简单了,让别人回答
2:用个全局变量来保存A窗口的指针。(但我不知道何时在哪里如何来获得A窗口的指针)希望大侠们给出具体代码。
谢谢!
HWND hWnd = ::FindWindow(NULL,"Example"); //Example 是A窗口的标题
CIPAddressCtrl *m_Address = (CIPAddressCtrl *)::GetDlgItem(hWnd,IDC_IPADDRESS1); //出错而我用CWin::::FindWindow(NULL,"Example");也不行,因为它返回的是CWin*类型,而不是HANDLE句柄。
高人能给个具体代码么?
如果是特定窗口,还可以更容易些
while(hWndChild)
{
hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT);
}
你不是要文本么?
GetDlgItemtext吧
hWnd = GetDlgItem(hWnd,IDC_IPADDRESS1);
CIPAddressCtrl m_Address;
m_Address.FromHandle(hWnd);
跨进程请使用findchildwindow遍历
大致如下#define WM_GETIPCTRL WM_APP + 1class A
{
CIPAddressCtrl* m_Address;// 窗口创建时建立控件对应指针, 处理OnCreate()或OnInitDialog()
int OnCreate(...)
{
m_Address=(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1);
}// 重写OnWndMsg()方法
BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
if (message == WM_GETIPCTRL)
{
*pResult = (LRESULT*)m_Address;
return TRUE;
}
return __super::OnWndMsg(message,wParam,lParam,pResult);
}
};在class b 中处理用FindWindow查找窗口A的窗口,
然后向窗口发送消息获取控件指针(CIPAddressCtrl) *pCtrl = ::SendMessage(A.窗口句柄,WM_GETIPCTRL,0,0);
HWND FindWindowEx(
HWND hwndParent, // handle to parent window
HWND hwndChildAfter, // handle to child window
LPCTSTR lpszClass, // class name
LPCTSTR lpszWindow // window name
);
/*如果 Parent 是 0, 则函数以桌面窗口为父窗口, 查找桌面窗口的所有子窗口;
如果 是 HWND_MESSAGE, 函数仅查找所有消息窗口;
子窗口必须是 Parent 窗口的直接子窗口;
如果 Child 是 0, 查找从 Parent 的第一个子窗口开始;
如果 Parent 和 Child 同时是 0, 则函数查找所有的顶层窗口及消息窗口.
*/
为什么一定要直接找到A窗口,你可以通过一个中间量来中转嘛,如果基于CDialog模式的应用程序,A、B窗口确实关系比较远,可以可以全局的变量保存A窗口的m_hWnd句柄,再给它发送消息,如果是基础SDI或者MDI模式的应用程序,而且、B窗口确实关系比较远,可以使用CMainFrame来中转消息。B发消息给CMainFrame,CMainFrame发送消息给A。