上次说的那个FLASH内的按钮句柄找不到,但这个FLASH的句柄为什么用
HWND hflashWnd = ::FindWindowEx(pHtmlctrl->m_hWnd, NULL, "MacromediaFlashPlayerActiveX", NULL);也无法找到呢.求代码.谢谢!
C++技术网解答:
先上代码:
HWND hwnd= this->m_hWnd;
HWND hshewnd=::FindWindowEx(hwnd,NULL,"Shell Embedding",NULL);
HWND hdocwnd=::FindWindowEx(hshewnd,NULL,"Shell DocObject View",NULL);
HWND htmlwnd=::FindWindowEx(hdocwnd,NULL,"Internet Explorer_Server",NULL);
HWND hflashwnd=NULL;
HWND hnextwnd=NULL;
do
{
hnextwnd=::FindWindowEx(htmlwnd,hnextwnd,"MacromediaFlashPlayerActiveX",NULL);
if (hnextwnd)
{
CRect rect;
::GetClientRect(hnextwnd,rect);
if (rect.Width()>=700)
{
CString str;
str.Format("%X",hnextwnd);
AfxMessageBox(str);
break;
}
}
}while(hnextwnd);
通过spy++定位flash的activeX控件,得到下面这样的窗口句柄结构:
可以看到,flash控件不是简单的一个窗口,而是嵌套了多层窗口关系。在查找窗口时,需要逐层的查找窗口。这也是代码中为什么多次查找窗口的原因。
然后用程序找窗口,得到的句柄和SPY++的一致,如下图所示:
这也说明代码工作正常。如果直接找最后一层的Flash窗口,是找不到的,因为你不知道父窗口句柄。只有一层层的找。
最后说明:这个解答的答案,是在指导提问者后,提问者自己一步步解决的,我提供的只是关键的方法,比如SPY++找到窗口的分层结构和获取窗口客户区的大小的函数GetClientRect函数,其他都是提问者自己在指导后一步步实现,并写好代码的。
这个解答可以终结网上大量的查找Flash句柄的无解答的提问,并且有通过测试的代码。