向IE窗口发消息 你能找到这些窗口的句柄么?我用Spy++,不能发现它们的句柄 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 why not use bho(Browser Helper Objects)? 我写了一个类似的东西,通过得到IE窗口句柄,然后把窗口至于最前端,最后模拟键盘。HWND hWnd=::FindWindow("IEFrame",NULL); ::SetForegroundWindow(hWnd); ::SetActiveWindow(hWnd); ::SetFocus(hWnd); CopyString("110"); CopyString("284"); for(int i=0;i<9;i++) { CString strTmp; strTmp.Format("%d",111+i); CopyString(strTmp); keybd_event( VK_TAB, 0, 0, 0 ); keybd_event( VK_TAB, 0, KEYEVENTF_KEYUP, 0); } 我做过实验,IE窗口开的控件窗口没有句柄;我还在书上看到过好象使用COM才能较好地处理这种问题,请方家指正。如果用键盘模拟方式,焦点如何处理(有多个控件文本窗口、雷达钮等)?大家可以设想为一个聊天室写个自动聊天程序,功能是每隔一段时间发言。但是这个聊天室在每次发言后,自动失去焦点,光标不在文本窗。 要利用“对象组件库”技术中的Document-->Forms-->Elements SendMessage(hwnd,WM_SETTEXT,wparam,lparam); 应该可以 我写了一个小程序,用来看小说的(支持网页和记事本),能定时向它们发送翻页的消息(长期看小说,自用呵呵),同样你也可以发不同的消息啊,有兴趣可以去看看啊,http://cn.briefcase.yahoo.com/yg_xh(是一个程序),用了后给点意见,可以给你原码。 to pitchstar: 但是控件文本窗没有hwnd(用spy都无法得到) to yg_xh: 我们需要的是操作网页上的控件,不是研究它们的刷新周期。所以似乎你的程序并不符这道题呢。 要向窗口发送消息,必须知道该窗口的句柄或指针,用FindWindow()就可以了 要向窗口发送消息,必须知道该窗口的句柄或指针,用FindWindow()就可以了 然后用SendMessage() 应该是 com 来解决问题,可惜我不会 给你一段COM技术实现的例程,是抄来的,自己琢磨一下吧。CFrameWnd * pFrame=(CFrameWnd *)(AfxGetMainWnd()); ASSERT_VALID(pFrame); CHtmlView *pHtmlView=(CHtmlView *)(pFrame->GetActiveView()); ASSERT_VALID(pHtmlView); Idispatch *pDisp=pHtmlView->GetHtmlDocument(); if(pDisp != NULL) { IHTMLDocument2 * pHTMLDocument2; HRESULT hr; hr = pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pHTMLDocument2); if(hr==S_OK) { IHTMLElementCollection * pColl = NULL; hr=pHTMLDocument2->get_anchors(&pColl); if(hr==S_OK&&pColl!=NULL) { LONG nElem; hr=pColl->get_length(&nElem); if(hr==S_OK) { for(long I=0;I<nElem;I++) { _variant_t vIndex(I); _variant_t vName=vIndex; Idispatch *pDisp2; hr=pColl->item(vName,vIndex,&pDisp2); if(hr==S_OK) { IHTMLAnchorElement * pAnchElem; hr=pDisp->QueryInterface(IID_IHTMLAnchorElement,(void**)&pAnchElem); if(hr==S_OK) { BSTR bstrRef=0; pAnchElem->get_href(&bstrRef); Cstring strLink(bstrRef); if(!strLink.IsEmpty()) { m_lbLinkList.AddString(strLink); SysFreeString(bstrRef); pAnchElem->Release(); } pDisp2->Release(); } } } pColl->Release(); } pHTMLDocument2->Release(); } pDisp->Release(); } } 补充:上面的代码不是针对你的问题的,你把上面的代码看懂了,就会编写自己的代码了。另外,提示一下,用Visual Studio的工具object viewer查IE object的Interface。肯定可以实现的。 to 阿轩: 我正好找了一些有关于COM的书来看了看,你的代码很有启发!谢谢你. to axuan: 有一点不太明白,这么多的if(hr==S_OK)一层一层地套进去有什么用? MFC中的edit控件怎样能被多次赋值并且控件上都显示出所赋的值 CEdit自动刷新问题 CreateDesktop多桌面截图的问题 关于数组的提问 create创建窗口的问题!很着急! too 简单 请高手帮帮忙(容器类的使用) VC6不支持<fstream>? 各位大哥帮帮忙,为什么我统计的时间不是自己想要的时间?? 急问,大家帮我看看 如何将DWORD和LPVOID转换为CString呢? 谁知道怎么避开公司的代理服务器?
HWND hWnd=::FindWindow("IEFrame",NULL);
::SetForegroundWindow(hWnd);
::SetActiveWindow(hWnd);
::SetFocus(hWnd);
CopyString("110");
CopyString("284");
for(int i=0;i<9;i++)
{
CString strTmp;
strTmp.Format("%d",111+i);
CopyString(strTmp);
keybd_event( VK_TAB, 0, 0, 0 );
keybd_event( VK_TAB, 0, KEYEVENTF_KEYUP, 0);
}
如果用键盘模拟方式,焦点如何处理(有多个控件文本窗口、雷达钮等)?
大家可以设想为一个聊天室写个自动聊天程序,功能是每隔一段时间发言。但是这个聊天室在每次发言后,自动失去焦点,光标不在文本窗。
但是控件文本窗没有hwnd(用spy都无法得到)
我们需要的是操作网页上的控件,不是研究它们的刷新周期。所以似乎你的程序并不符这道题呢。
然后用SendMessage()
CFrameWnd * pFrame=(CFrameWnd *)(AfxGetMainWnd());
ASSERT_VALID(pFrame); CHtmlView *pHtmlView=(CHtmlView *)(pFrame->GetActiveView());
ASSERT_VALID(pHtmlView); Idispatch *pDisp=pHtmlView->GetHtmlDocument(); if(pDisp != NULL)
{
IHTMLDocument2 * pHTMLDocument2;
HRESULT hr; hr = pDisp->QueryInterface(IID_IHTMLDocument2,
(void**)&pHTMLDocument2); if(hr==S_OK)
{
IHTMLElementCollection * pColl = NULL;
hr=pHTMLDocument2->get_anchors(&pColl);
if(hr==S_OK&&pColl!=NULL)
{
LONG nElem;
hr=pColl->get_length(&nElem);
if(hr==S_OK)
{
for(long I=0;I<nElem;I++)
{
_variant_t vIndex(I);
_variant_t vName=vIndex; Idispatch *pDisp2;
hr=pColl->item(vName,vIndex,&pDisp2);
if(hr==S_OK)
{
IHTMLAnchorElement * pAnchElem;
hr=pDisp->QueryInterface(IID_IHTMLAnchorElement,(void**)&pAnchElem);
if(hr==S_OK)
{
BSTR bstrRef=0;
pAnchElem->get_href(&bstrRef); Cstring strLink(bstrRef); if(!strLink.IsEmpty())
{
m_lbLinkList.AddString(strLink);
SysFreeString(bstrRef);
pAnchElem->Release();
}
pDisp2->Release();
}
}
}
pColl->Release();
}
pHTMLDocument2->Release();
}
pDisp->Release();
}
}
上面的代码不是针对你的问题的,你把上面的代码看懂了,就会编写自己的代码了。
另外,提示一下,用Visual Studio的工具object viewer查IE object的Interface。
肯定可以实现的。
我正好找了一些有关于COM的书来看了看,你的代码很有启发!谢谢你.
有一点不太明白,这么多的if(hr==S_OK)一层一层地套进去有什么用?