当前位置:C++技术网 > 资讯 > 怎么找到一个网页内的FLASH句柄呢?

怎么找到一个网页内的FLASH句柄呢?

更新时间:2016-09-06 23:51:24浏览次数:1+次

上次说的那个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句柄呢?

    可以看到,flash控件不是简单的一个窗口,而是嵌套了多层窗口关系。在查找窗口时,需要逐层的查找窗口。这也是代码中为什么多次查找窗口的原因。

    然后用程序找窗口,得到的句柄和SPY++的一致,如下图所示:

怎么找到一个网页内的FLASH句柄呢?

    这也说明代码工作正常。如果直接找最后一层的Flash窗口,是找不到的,因为你不知道父窗口句柄。只有一层层的找。

    最后说明:这个解答的答案,是在指导提问者后,提问者自己一步步解决的,我提供的只是关键的方法,比如SPY++找到窗口的分层结构和获取窗口客户区的大小的函数GetClientRect函数,其他都是提问者自己在指导后一步步实现,并写好代码的。

    这个解答可以终结网上大量的查找Flash句柄的无解答的提问,并且有通过测试的代码。