请问各位大侠,如果遍历一个进程窗口中所有的控件的类名?
我想获得进程中的Internet Explorer_Server的hwnd,但它的父类是一个不确定的类名,如Afx:1640000:b:10011:1900010:0这样的东西。是否可以像spy++那样列出具体一个进程窗口所有控件的类来得到Internet Explorer_Server的hwnd?但小弟初学不太懂API,各位大侠是否可以指教一二?万分感谢! 问题点数:100、回复次数:11Top
1 楼microyzy(人不在牛,分高就行;分不在高,人牛也行)回复于 2005-02-01 12:19:41 得分 50
获得窗口控件使用EnumChildWindows,看msdn吧
不过它不能获得ie窗口里的控件,这个需要调用ie提供的自动化接口,网上有很多这类文章,我 看看我这里有没有代码。。。Top
2 楼microyzy(人不在牛,分高就行;分不在高,人牛也行)回复于 2005-02-01 12:25:50 得分 0
IE窗口的类名应该是这个:Internet Explorer_ServerTop
3 楼microyzy(人不在牛,分高就行;分不在高,人牛也行)回复于 2005-02-01 12:27:56 得分 0
楼主将就着看,不然就到google上搜索吧,别人的可能比我的清楚的多,呵呵
//获取IE文档的对象
HINSTANCE hInst =NULL;
LPFNOBJECTFROMLRESULT pfObjectFromLresult=NULL;
HRESULT hr;
CComPtr<IHTMLDocument2> spDoc;
CComPtr<IDispatch> spDisp;
CComPtr<IDispatch> spDisp2;
CComPtr<IDispatch> spDisp3;
CComQIPtr<IHTMLWindow2> spWin;
CComPtr<IHTMLElementCollection> pElements;
CComPtr<IHTMLElementCollection> pEdits;
CComPtr<IHTMLInputTextElement> pEdit;
CComVariant iname="pr";//文本框名称
CComVariant index=0;
CComBSTR bstr1;
LRESULT lRes=0;
int iToDo;//要求的总数
int iFound=0;//发现的总数
BOOL bInteger=FALSE;//要不要整数
int iCurrent;//当前值(10倍)
int fInterval;//每次增减的量,用正负号表示
int i=0;
char stmp[256];
UINT nMsg = ::RegisterWindowMessage("WM_HTML_GETOBJECT");
bInteger=!IsDlgButtonChecked(IDC_CHECK1);
GetDlgItem(IDC_EDIT1)->GetWindowText(stmp,sizeof(stmp));
iCurrent=(int)(atof(stmp)*10);
if(IsDlgButtonChecked(IDC_CHECK2))
fInterval=-1;
else
fInterval=1;
::SendMessageTimeout(hIECTL,nMsg, 0L, 0L,SMTO_ABORTIFHUNG,1000,(DWORD*)&lRes);
hInst = ::LoadLibrary("OLEACC.DLL");
if(!hInst)
goto err_com;
pfObjectFromLresult=(LPFNOBJECTFROMLRESULT)::GetProcAddress(hInst,"ObjectFromLresult");
if(!pfObjectFromLresult)
goto err_dll;
hr = pfObjectFromLresult(lRes,IID_IHTMLDocument,0,(void**)&spDoc );
if (FAILED(hr))
goto err_dll;
spDoc->get_Script( &spDisp );
spWin = spDisp;
spWin->get_document( &spDoc.p);
//可以开始控制网页
//spDoc->put_bgColor(CComVariant("red"));
//查找文本输入框,并自动填充数字
//所有的文本框名字均叫“pr”
if(FAILED(spDoc->get_all(&pElements)))
goto err_dll;
while(TRUE)
{
hr=pElements->item(iname,index,(IDispatch**)&spDisp2);
if(SUCCEEDED(hr) && spDisp2)
{
hr=spDisp2->QueryInterface(IID_IHTMLInputTextElement,(void**)&pEdit);
if(SUCCEEDED(hr) && pEdit)
{
pEdit->get_type(&bstr1);
if(bstr1==_T("text"))//找到一个text
{
iFound++;
if(iFound<=iToDo)
{
//是否是整数
if(!bInteger)
{
if(iCurrent/10*10==iCurrent)
iCurrent+=fInterval;
}
char snum[64];
sprintf(snum,"%.1f",((double)iCurrent/10));
CComBSTR b1=snum;
pEdit->put_value(b1);
iCurrent+=fInterval;
}
else
{
CComBSTR b1="";
pEdit->put_value(b1);
}
}
pEdit.Detach();
}
}
else
break;
index.intVal+=1;
spDisp2.Detach();
}
if(iFound<=0)
MessageBox("NOT found!");
else
MessageBox("OK!");Top
4 楼yunboddd(云波)回复于 2005-02-01 13:44:51 得分 0
谢谢你!
不过大哥 我只要得到Internet Explorer_Server的hwnd即可,网页中的控件暂时还搞不上Top
5 楼kingzai(stevenzhu)回复于 2005-02-01 13:57:52 得分 50
you can use EnumWindows to get all IE window,then call
BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
{
TCHAR buf[100];
CString strhwnd;
::GetClassName( hwnd, (LPTSTR)&buf, 100 );
if ( _tcscmp( buf, _T("Internet Explorer_Server") ) == 0 )
{
*(HWND*)lParam = hwnd;
return FALSE;
}
else
return TRUE;
};
Top
6 楼yunboddd(云波)回复于 2005-02-01 16:04:48 得分 0
大哥,不是IE,IE的话我就不用这么费劲了
是嵌入在父类是一个不确定的类名,如Afx:1640000:b:10011:1900010:0里的Top
7 楼legendhui(秋天的叶子)回复于 2005-02-01 16:07:23 得分 0
EnumChildWindowsTop
8 楼kwiner(ak.net)回复于 2005-02-02 11:46:14 得分 0
FindWindowExTop
9 楼microyzy(人不在牛,分高就行;分不在高,人牛也行)回复于 2005-02-02 13:44:02 得分 0
你的意思是不是说在窗口里面有IE控件,你想得到IE控件的句柄?
如果是,那就用EnumChildWindows,得到每个控件的hwnd后,获取它的classname,然后就知道这个控件是不是IE控件了
只要是固定的控件,肯定会有固定的类名,你还不如直接告诉大家你想找什么东西,也许这个现象:
“是嵌入在父类是一个不确定的类名,如Afx:1640000:b:10011:1900010:0里的”
迷惑了你Top
10 楼microyzy(人不在牛,分高就行;分不在高,人牛也行)回复于 2005-02-02 13:45:28 得分 0
也迷惑了大家。。。Top
11 楼yunboddd(云波)回复于 2005-02-02 20:56:02 得分 0
...小弟比较菜~ 谢谢microyzy(毛毛叉)的分析,及 kingzai(stevenzhu)的代码Top




